testsuite, threads: fix LD_LIBRARY_PATH in 'tls-sepdebug.exp'
[binutils-gdb.git] / gdb / vax-bsd-nat.c
blob2a4db3a81218e0ed919f6648f815c6595a8515b4
1 /* Native-dependent code for modern VAX BSD's.
3 Copyright (C) 2004-2024 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
20 /* We define this to get types like register_t. */
21 #define _KERNTYPES
22 #include "inferior.h"
23 #include "regcache.h"
24 #include "target.h"
26 #include <sys/types.h>
27 #include <sys/ptrace.h>
28 #include <machine/reg.h>
30 #include "vax-tdep.h"
31 #include "inf-ptrace.h"
32 #include "netbsd-nat.h"
34 struct vax_bsd_nat_target final : public nbsd_nat_target
36 void fetch_registers (struct regcache *, int) override;
37 void store_registers (struct regcache *, int) override;
40 static vax_bsd_nat_target the_vax_bsd_nat_target;
42 /* Supply the general-purpose registers stored in GREGS to REGCACHE. */
44 static void
45 vaxbsd_supply_gregset (struct regcache *regcache, const void *gregs)
47 const gdb_byte *regs = (const gdb_byte *)gregs;
48 int regnum;
50 for (regnum = 0; regnum < VAX_NUM_REGS; regnum++)
51 regcache->raw_supply (regnum, regs + regnum * 4);
54 /* Collect the general-purpose registers from REGCACHE and store them
55 in GREGS. */
57 static void
58 vaxbsd_collect_gregset (const struct regcache *regcache,
59 void *gregs, int regnum)
61 gdb_byte *regs = (void *)gregs;
62 int i;
64 for (i = 0; i <= VAX_NUM_REGS; i++)
66 if (regnum == -1 || regnum == i)
67 regcache->raw_collect (i, regs + i * 4);
72 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
73 for all registers. */
75 void
76 vax_bsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
78 struct reg regs;
79 pid_t pid = regcache->ptid ().pid ();
80 int lwp = regcache->ptid ().lwp ();
82 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
83 perror_with_name (_("Couldn't get registers"));
85 vaxbsd_supply_gregset (regcache, &regs);
88 /* Store register REGNUM back into the inferior. If REGNUM is -1, do
89 this for all registers. */
91 void
92 vax_bsd_nat_target::store_registers (struct regcache *regcache, int regnum)
94 struct reg regs;
95 pid_t pid = regcache->ptid ().pid ();
96 int lwp = regcache->ptid ().lwp ();
98 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
99 perror_with_name (_("Couldn't get registers"));
101 vaxbsd_collect_gregset (regcache, &regs, regnum);
103 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
104 perror_with_name (_("Couldn't write registers"));
108 /* Support for debugging kernel virtual memory images. */
110 #include <machine/pcb.h>
112 #include "bsd-kvm.h"
114 static int
115 vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
117 int regnum;
119 /* The following is true for OpenBSD 3.5:
121 The pcb contains the register state at the context switch inside
122 cpu_switch(). */
124 /* The stack pointer shouldn't be zero. */
125 if (pcb->KSP == 0)
126 return 0;
128 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++)
129 regcache->raw_supply (regnum, &pcb->R[regnum - VAX_R0_REGNUM]);
130 regcache->raw_supply (VAX_AP_REGNUM, &pcb->AP);
131 regcache->raw_supply (VAX_FP_REGNUM, &pcb->FP);
132 regcache->raw_supply (VAX_SP_REGNUM, &pcb->KSP);
133 regcache->raw_supply (VAX_PC_REGNUM, &pcb->PC);
134 regcache->raw_supply (VAX_PS_REGNUM, &pcb->PSL);
136 return 1;
139 void _initialize_vaxbsd_nat ();
140 void
141 _initialize_vaxbsd_nat ()
143 add_inf_child_target (&the_vax_bsd_nat_target);
145 /* Support debugging kernel virtual memory images. */
146 bsd_kvm_add_target (vaxbsd_supply_pcb);