Add explicit cast to fix build of vax-bsd-nat.c
[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 ();
53284fc1 81
bcc0c096 82 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 83 perror_with_name (_("Couldn't get registers"));
53284fc1 84
56be3814 85 vaxbsd_supply_gregset (regcache, &regs);
53284fc1
MK
86}
87
88/* Store register REGNUM back into the inferior. If REGNUM is -1, do
89 this for all registers. */
90
f6ac5f3d
PA
91void
92vax_bsd_nat_target::store_registers (struct regcache *regcache, int regnum)
53284fc1
MK
93{
94 struct reg regs;
e99b03dc 95 pid_t pid = regcache->ptid ().pid ();
53284fc1 96
bcc0c096 97 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 98 perror_with_name (_("Couldn't get registers"));
53284fc1 99
56be3814 100 vaxbsd_collect_gregset (regcache, &regs, regnum);
53284fc1 101
bcc0c096 102 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 103 perror_with_name (_("Couldn't write registers"));
53284fc1 104}
7ddd7709
MK
105\f
106
107/* Support for debugging kernel virtual memory images. */
108
7ddd7709
MK
109#include <machine/pcb.h>
110
111#include "bsd-kvm.h"
112
113static int
114vaxbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
115{
116 int regnum;
117
118 /* The following is true for OpenBSD 3.5:
119
120 The pcb contains the register state at the context switch inside
121 cpu_switch(). */
122
123 /* The stack pointer shouldn't be zero. */
124 if (pcb->KSP == 0)
125 return 0;
126
127 for (regnum = VAX_R0_REGNUM; regnum < VAX_AP_REGNUM; regnum++)
73e1c03f
SM
128 regcache->raw_supply (regnum, &pcb->R[regnum - VAX_R0_REGNUM]);
129 regcache->raw_supply (VAX_AP_REGNUM, &pcb->AP);
130 regcache->raw_supply (VAX_FP_REGNUM, &pcb->FP);
131 regcache->raw_supply (VAX_SP_REGNUM, &pcb->KSP);
132 regcache->raw_supply (VAX_PC_REGNUM, &pcb->PC);
133 regcache->raw_supply (VAX_PS_REGNUM, &pcb->PSL);
7ddd7709
MK
134
135 return 1;
136}
7ddd7709 137
6c265988 138void _initialize_vaxbsd_nat ();
7ddd7709 139void
6c265988 140_initialize_vaxbsd_nat ()
7ddd7709 141{
d9f719f1 142 add_inf_child_target (&the_vax_bsd_nat_target);
ba0cd111 143
7ddd7709
MK
144 /* Support debugging kernel virtual memory images. */
145 bsd_kvm_add_target (vaxbsd_supply_pcb);
146}
This page took 2.433821 seconds and 4 git commands to generate.