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