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