Import alloca explicitly
[deliverable/binutils-gdb.git] / gdb / vaxbsd-nat.c
CommitLineData
b9e1c0d6 1/* Native-dependent code for modern VAX BSD's.
53284fc1 2
ecd75fc8 3 Copyright (C) 2004-2014 Free Software Foundation, Inc.
53284fc1
MK
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
53284fc1
MK
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
53284fc1
MK
19
20#include "defs.h"
21#include "inferior.h"
22#include "regcache.h"
ba0cd111 23#include "target.h"
53284fc1
MK
24
25#include <sys/types.h>
26#include <sys/ptrace.h>
27#include <machine/reg.h>
28
29#include "vax-tdep.h"
ba0cd111 30#include "inf-ptrace.h"
53284fc1
MK
31
32/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
33
34static void
35vaxbsd_supply_gregset (struct regcache *regcache, const void *gregs)
36{
8cc49c48 37 const gdb_byte *regs = gregs;
53284fc1
MK
38 int regnum;
39
40 for (regnum = 0; regnum < VAX_NUM_REGS; regnum++)
41 regcache_raw_supply (regcache, regnum, regs + regnum * 4);
42}
43
44/* Collect the general-purpose registers from REGCACHE and store them
45 in GREGS. */
46
47static void
48vaxbsd_collect_gregset (const struct regcache *regcache,
49 void *gregs, int regnum)
50{
8cc49c48 51 gdb_byte *regs = gregs;
53284fc1
MK
52 int i;
53
54 for (i = 0; i <= VAX_NUM_REGS; i++)
55 {
56 if (regnum == -1 || regnum == i)
5df97fde 57 regcache_raw_collect (regcache, i, regs + i * 4);
53284fc1
MK
58 }
59}
60\f
61
62/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
63 for all registers. */
64
ba0cd111 65static void
28439f5e
PA
66vaxbsd_fetch_inferior_registers (struct target_ops *ops,
67 struct regcache *regcache, int regnum)
53284fc1
MK
68{
69 struct reg regs;
70
dfd4cc63 71 if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
9f8e0089 72 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 73 perror_with_name (_("Couldn't get registers"));
53284fc1 74
56be3814 75 vaxbsd_supply_gregset (regcache, &regs);
53284fc1
MK
76}
77
78/* Store register REGNUM back into the inferior. If REGNUM is -1, do
79 this for all registers. */
80
ba0cd111 81static void
28439f5e
PA
82vaxbsd_store_inferior_registers (struct target_ops *ops,
83 struct regcache *regcache, int regnum)
53284fc1
MK
84{
85 struct reg regs;
86
dfd4cc63 87 if (ptrace (PT_GETREGS, ptid_get_pid (inferior_ptid),
9f8e0089 88 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 89 perror_with_name (_("Couldn't get registers"));
53284fc1 90
56be3814 91 vaxbsd_collect_gregset (regcache, &regs, regnum);
53284fc1 92
dfd4cc63 93 if (ptrace (PT_SETREGS, ptid_get_pid (inferior_ptid),
9f8e0089 94 (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 95 perror_with_name (_("Couldn't write registers"));
53284fc1 96}
7ddd7709
MK
97\f
98
99/* Support for debugging kernel virtual memory images. */
100
7ddd7709
MK
101#include <machine/pcb.h>
102
103#include "bsd-kvm.h"
104
105static int
106vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
107{
108 int regnum;
109
110 /* The following is true for OpenBSD 3.5:
111
112 The pcb contains the register state at the context switch inside
113 cpu_switch(). */
114
115 /* The stack pointer shouldn't be zero. */
116 if (pcb->KSP == 0)
117 return 0;
118
119 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++)
120 regcache_raw_supply (regcache, regnum, &pcb->R[regnum - VAX_R0_REGNUM]);
121 regcache_raw_supply (regcache, VAX_AP_REGNUM, &pcb->AP);
122 regcache_raw_supply (regcache, VAX_FP_REGNUM, &pcb->FP);
123 regcache_raw_supply (regcache, VAX_SP_REGNUM, &pcb->KSP);
124 regcache_raw_supply (regcache, VAX_PC_REGNUM, &pcb->PC);
125 regcache_raw_supply (regcache, VAX_PS_REGNUM, &pcb->PSL);
126
127 return 1;
128}
129\f
130
131/* Provide a prototype to silence -Wmissing-prototypes. */
132void _initialize_vaxbsd_nat (void);
133
134void
135_initialize_vaxbsd_nat (void)
136{
ba0cd111
MK
137 struct target_ops *t;
138
139 t = inf_ptrace_target ();
140 t->to_fetch_registers = vaxbsd_fetch_inferior_registers;
141 t->to_store_registers = vaxbsd_store_inferior_registers;
142 add_target (t);
143
7ddd7709
MK
144 /* Support debugging kernel virtual memory images. */
145 bsd_kvm_add_target (vaxbsd_supply_pcb);
146}
This page took 1.196369 seconds and 4 git commands to generate.