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