]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/vaxbsd-nat.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / gdb / vaxbsd-nat.c
CommitLineData
b9e1c0d6 1/* Native-dependent code for modern VAX BSD's.
53284fc1 2
8acc9f48 3 Copyright (C) 2004-2013 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
71 if (ptrace (PT_GETREGS, PIDGET (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
87 if (ptrace (PT_GETREGS, PIDGET (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
MK
92
93 if (ptrace (PT_SETREGS, PIDGET (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
101#include <sys/types.h>
102#include <machine/pcb.h>
103
104#include "bsd-kvm.h"
105
106static int
107vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
108{
109 int regnum;
110
111 /* The following is true for OpenBSD 3.5:
112
113 The pcb contains the register state at the context switch inside
114 cpu_switch(). */
115
116 /* The stack pointer shouldn't be zero. */
117 if (pcb->KSP == 0)
118 return 0;
119
120 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++)
121 regcache_raw_supply (regcache, regnum, &pcb->R[regnum - VAX_R0_REGNUM]);
122 regcache_raw_supply (regcache, VAX_AP_REGNUM, &pcb->AP);
123 regcache_raw_supply (regcache, VAX_FP_REGNUM, &pcb->FP);
124 regcache_raw_supply (regcache, VAX_SP_REGNUM, &pcb->KSP);
125 regcache_raw_supply (regcache, VAX_PC_REGNUM, &pcb->PC);
126 regcache_raw_supply (regcache, VAX_PS_REGNUM, &pcb->PSL);
127
128 return 1;
129}
130\f
131
132/* Provide a prototype to silence -Wmissing-prototypes. */
133void _initialize_vaxbsd_nat (void);
134
135void
136_initialize_vaxbsd_nat (void)
137{
ba0cd111
MK
138 struct target_ops *t;
139
140 t = inf_ptrace_target ();
141 t->to_fetch_registers = vaxbsd_fetch_inferior_registers;
142 t->to_store_registers = vaxbsd_store_inferior_registers;
143 add_target (t);
144
7ddd7709
MK
145 /* Support debugging kernel virtual memory images. */
146 bsd_kvm_add_target (vaxbsd_supply_pcb);
147}