gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / vax-bsd-nat.c
CommitLineData
b9e1c0d6 1/* Native-dependent code for modern VAX BSD's.
53284fc1 2
b811d2c2 3 Copyright (C) 2004-2020 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 19
25567eee
KR
20/* We define this to get types like register_t. */
21#define _KERNTYPES
53284fc1
MK
22#include "defs.h"
23#include "inferior.h"
24#include "regcache.h"
ba0cd111 25#include "target.h"
53284fc1
MK
26
27#include <sys/types.h>
28#include <sys/ptrace.h>
29#include <machine/reg.h>
30
31#include "vax-tdep.h"
ba0cd111 32#include "inf-ptrace.h"
d5be5fa4 33#include "nbsd-nat.h"
53284fc1 34
d5be5fa4 35struct vax_bsd_nat_target final : public nbsd_nat_target
f6ac5f3d
PA
36{
37 void fetch_registers (struct regcache *, int) override;
38 void store_registers (struct regcache *, int) override;
39};
40
41static vax_bsd_nat_target the_vax_bsd_nat_target;
42
53284fc1
MK
43/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
44
45static void
46vaxbsd_supply_gregset (struct regcache *regcache, const void *gregs)
47{
12753073 48 const gdb_byte *regs = (const gdb_byte *)gregs;
53284fc1
MK
49 int regnum;
50
51 for (regnum = 0; regnum < VAX_NUM_REGS; regnum++)
73e1c03f 52 regcache->raw_supply (regnum, regs + regnum * 4);
53284fc1
MK
53}
54
55/* Collect the general-purpose registers from REGCACHE and store them
56 in GREGS. */
57
58static void
59vaxbsd_collect_gregset (const struct regcache *regcache,
60 void *gregs, int regnum)
61{
12753073 62 gdb_byte *regs = (void *)gregs;
53284fc1
MK
63 int i;
64
65 for (i = 0; i <= VAX_NUM_REGS; i++)
66 {
67 if (regnum == -1 || regnum == i)
34a79281 68 regcache->raw_collect (i, regs + i * 4);
53284fc1
MK
69 }
70}
71\f
72
73/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
74 for all registers. */
75
f6ac5f3d
PA
76void
77vax_bsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
53284fc1
MK
78{
79 struct reg regs;
e99b03dc 80 pid_t pid = regcache->ptid ().pid ();
6227b330 81 int lwp = regcache->ptid ().lwp ();
53284fc1 82
6227b330 83 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
e2e0b3e5 84 perror_with_name (_("Couldn't get registers"));
53284fc1 85
56be3814 86 vaxbsd_supply_gregset (regcache, &regs);
53284fc1
MK
87}
88
89/* Store register REGNUM back into the inferior. If REGNUM is -1, do
90 this for all registers. */
91
f6ac5f3d
PA
92void
93vax_bsd_nat_target::store_registers (struct regcache *regcache, int regnum)
53284fc1
MK
94{
95 struct reg regs;
e99b03dc 96 pid_t pid = regcache->ptid ().pid ();
6227b330 97 int lwp = regcache->ptid ().lwp ();
53284fc1 98
6227b330 99 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
e2e0b3e5 100 perror_with_name (_("Couldn't get registers"));
53284fc1 101
56be3814 102 vaxbsd_collect_gregset (regcache, &regs, regnum);
53284fc1 103
6227b330 104 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
e2e0b3e5 105 perror_with_name (_("Couldn't write registers"));
53284fc1 106}
7ddd7709
MK
107\f
108
109/* Support for debugging kernel virtual memory images. */
110
7ddd7709
MK
111#include <machine/pcb.h>
112
113#include "bsd-kvm.h"
114
115static int
116vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
117{
118 int regnum;
119
120 /* The following is true for OpenBSD 3.5:
121
122 The pcb contains the register state at the context switch inside
123 cpu_switch(). */
124
125 /* The stack pointer shouldn't be zero. */
126 if (pcb->KSP == 0)
127 return 0;
128
129 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++)
73e1c03f
SM
130 regcache->raw_supply (regnum, &pcb->R[regnum - VAX_R0_REGNUM]);
131 regcache->raw_supply (VAX_AP_REGNUM, &pcb->AP);
132 regcache->raw_supply (VAX_FP_REGNUM, &pcb->FP);
133 regcache->raw_supply (VAX_SP_REGNUM, &pcb->KSP);
134 regcache->raw_supply (VAX_PC_REGNUM, &pcb->PC);
135 regcache->raw_supply (VAX_PS_REGNUM, &pcb->PSL);
7ddd7709
MK
136
137 return 1;
138}
7ddd7709 139
6c265988 140void _initialize_vaxbsd_nat ();
7ddd7709 141void
6c265988 142_initialize_vaxbsd_nat ()
7ddd7709 143{
d9f719f1 144 add_inf_child_target (&the_vax_bsd_nat_target);
ba0cd111 145
7ddd7709
MK
146 /* Support debugging kernel virtual memory images. */
147 bsd_kvm_add_target (vaxbsd_supply_pcb);
148}
This page took 1.819199 seconds and 4 git commands to generate.