gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / ppc-nbsd-nat.c
CommitLineData
def18405
MK
1/* Native-dependent code for NetBSD/powerpc.
2
b811d2c2 3 Copyright (C) 2002-2020 Free Software Foundation, Inc.
def18405 4
485721b1 5 Contributed by Wasabi Systems, Inc.
e42180d7
C
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
e42180d7
C
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
e42180d7 21
52feded7
KR
22/* We define this to get types like register_t. */
23#define _KERNTYPES
0baeab03
PA
24#include "defs.h"
25
e42180d7
C
26#include <sys/types.h>
27#include <sys/ptrace.h>
28#include <machine/reg.h>
69e9e646
NW
29#include <machine/frame.h>
30#include <machine/pcb.h>
e42180d7 31
69e9e646 32#include "gdbcore.h"
def18405 33#include "inferior.h"
69e9e646 34#include "regcache.h"
def18405 35
485721b1 36#include "ppc-tdep.h"
03b62bbb 37#include "ppc-nbsd-tdep.h"
def18405 38#include "bsd-kvm.h"
5bf970f9 39#include "inf-ptrace.h"
9faa006d 40#include "nbsd-nat.h"
5bf970f9 41
9faa006d 42struct ppc_nbsd_nat_target final : public nbsd_nat_target
f6ac5f3d
PA
43{
44 void fetch_registers (struct regcache *, int) override;
45 void store_registers (struct regcache *, int) override;
46};
47
48static ppc_nbsd_nat_target the_ppc_nbsd_nat_target;
49
485721b1 50/* Returns true if PT_GETREGS fetches this register. */
def18405 51
485721b1 52static int
206988c4 53getregs_supplies (struct gdbarch *gdbarch, int regnum)
e42180d7 54{
206988c4 55 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
485721b1 56
def18405
MK
57 return ((regnum >= tdep->ppc_gp0_regnum
58 && regnum < tdep->ppc_gp0_regnum + ppc_num_gprs)
59 || regnum == tdep->ppc_lr_regnum
60 || regnum == tdep->ppc_cr_regnum
61 || regnum == tdep->ppc_xer_regnum
62 || regnum == tdep->ppc_ctr_regnum
206988c4 63 || regnum == gdbarch_pc_regnum (gdbarch));
e42180d7
C
64}
65
485721b1 66/* Like above, but for PT_GETFPREGS. */
def18405 67
485721b1 68static int
206988c4 69getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
e42180d7 70{
206988c4 71 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
e42180d7 72
383f0f5b
JB
73 /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
74 point registers. Traditionally, GDB's register set has still
75 listed the floating point registers for such machines, so this
76 code is harmless. However, the new E500 port actually omits the
77 floating point registers entirely from the register set --- they
78 don't even have register numbers assigned to them.
79
80 It's not clear to me how best to update this code, so this assert
81 will alert the first person to encounter the NetBSD/E500
82 combination to the problem. */
206988c4 83 gdb_assert (ppc_floating_point_unit_p (gdbarch));
383f0f5b 84
def18405
MK
85 return ((regnum >= tdep->ppc_fp0_regnum
86 && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
87 || regnum == tdep->ppc_fpscr_regnum);
485721b1 88}
e42180d7 89
f6ac5f3d
PA
90void
91ppc_nbsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
e42180d7 92{
ac7936df 93 struct gdbarch *gdbarch = regcache->arch ();
e99b03dc 94 pid_t pid = regcache->ptid ().pid ();
c7da12c7 95 int lwp = regcache->ptid ().lwp ();
206988c4
MD
96
97 if (regnum == -1 || getregs_supplies (gdbarch, regnum))
485721b1
JT
98 {
99 struct reg regs;
100
c7da12c7 101 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
e2e0b3e5 102 perror_with_name (_("Couldn't get registers"));
485721b1 103
56be3814 104 ppc_supply_gregset (&ppcnbsd_gregset, regcache,
def18405 105 regnum, &regs, sizeof regs);
485721b1
JT
106 }
107
206988c4 108 if (regnum == -1 || getfpregs_supplies (gdbarch, regnum))
485721b1
JT
109 {
110 struct fpreg fpregs;
111
c7da12c7 112 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, lwp) == -1)
e2e0b3e5 113 perror_with_name (_("Couldn't get FP registers"));
485721b1 114
56be3814 115 ppc_supply_fpregset (&ppcnbsd_fpregset, regcache,
def18405 116 regnum, &fpregs, sizeof fpregs);
485721b1 117 }
e42180d7
C
118}
119
f6ac5f3d
PA
120void
121ppc_nbsd_nat_target::store_registers (struct regcache *regcache, int regnum)
e42180d7 122{
ac7936df 123 struct gdbarch *gdbarch = regcache->arch ();
e99b03dc 124 pid_t pid = regcache->ptid ().pid ();
c7da12c7 125 int lwp = regcache->ptid ().lwp ();
206988c4
MD
126
127 if (regnum == -1 || getregs_supplies (gdbarch, regnum))
485721b1
JT
128 {
129 struct reg regs;
130
c7da12c7 131 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
e2e0b3e5 132 perror_with_name (_("Couldn't get registers"));
485721b1 133
56be3814 134 ppc_collect_gregset (&ppcnbsd_gregset, regcache,
def18405 135 regnum, &regs, sizeof regs);
485721b1 136
c7da12c7 137 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, lwp) == -1)
e2e0b3e5 138 perror_with_name (_("Couldn't write registers"));
485721b1
JT
139 }
140
206988c4 141 if (regnum == -1 || getfpregs_supplies (gdbarch, regnum))
485721b1
JT
142 {
143 struct fpreg fpregs;
144
c7da12c7 145 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, lwp) == -1)
e2e0b3e5 146 perror_with_name (_("Couldn't get FP registers"));
485721b1 147
56be3814 148 ppc_collect_fpregset (&ppcnbsd_fpregset, regcache,
def18405
MK
149 regnum, &fpregs, sizeof fpregs);
150
c7da12c7 151 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, lwp) == -1)
e2e0b3e5 152 perror_with_name (_("Couldn't set FP registers"));
485721b1 153 }
e42180d7 154}
69e9e646
NW
155
156static int
157ppcnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
158{
159 struct switchframe sf;
160 struct callframe cf;
ac7936df 161 struct gdbarch *gdbarch = regcache->arch ();
40a6adc1 162 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
69e9e646
NW
163 int i;
164
165 /* The stack pointer shouldn't be zero. */
166 if (pcb->pcb_sp == 0)
167 return 0;
168
def18405 169 read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf);
73e1c03f
SM
170 regcache->raw_supply (tdep->ppc_cr_regnum, &sf.cr);
171 regcache->raw_supply (tdep->ppc_gp0_regnum + 2, &sf.fixreg2);
69e9e646 172 for (i = 0 ; i < 19 ; i++)
73e1c03f 173 regcache->raw_supply (tdep->ppc_gp0_regnum + 13 + i, &sf.fixreg[i]);
69e9e646 174
def18405 175 read_memory(sf.sp, (gdb_byte *)&cf, sizeof(cf));
73e1c03f
SM
176 regcache->raw_supply (tdep->ppc_gp0_regnum + 30, &cf.r30);
177 regcache->raw_supply (tdep->ppc_gp0_regnum + 31, &cf.r31);
178 regcache->raw_supply (tdep->ppc_gp0_regnum + 1, &cf.sp);
69e9e646 179
def18405 180 read_memory(cf.sp, (gdb_byte *)&cf, sizeof(cf));
73e1c03f
SM
181 regcache->raw_supply (tdep->ppc_lr_regnum, &cf.lr);
182 regcache->raw_supply (gdbarch_pc_regnum (gdbarch), &cf.lr);
69e9e646
NW
183
184 return 1;
185}
186
6c265988 187void _initialize_ppcnbsd_nat ();
69e9e646 188void
6c265988 189_initialize_ppcnbsd_nat ()
69e9e646
NW
190{
191 /* Support debugging kernel virtual memory images. */
192 bsd_kvm_add_target (ppcnbsd_supply_pcb);
def18405 193
d9f719f1 194 add_inf_child_target (&the_ppc_nbsd_nat_target);
69e9e646 195}
This page took 1.853864 seconds and 4 git commands to generate.