Fix compile time warnings about the possibility of using uninitialised fields in...
[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
AC
39#include "inf-ptrace.h"
40
f6ac5f3d
PA
41struct ppc_nbsd_nat_target final : public inf_ptrace_target
42{
43 void fetch_registers (struct regcache *, int) override;
44 void store_registers (struct regcache *, int) override;
45};
46
47static ppc_nbsd_nat_target the_ppc_nbsd_nat_target;
48
485721b1 49/* Returns true if PT_GETREGS fetches this register. */
def18405 50
485721b1 51static int
206988c4 52getregs_supplies (struct gdbarch *gdbarch, int regnum)
e42180d7 53{
206988c4 54 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
485721b1 55
def18405
MK
56 return ((regnum >= tdep->ppc_gp0_regnum
57 && regnum < tdep->ppc_gp0_regnum + ppc_num_gprs)
58 || regnum == tdep->ppc_lr_regnum
59 || regnum == tdep->ppc_cr_regnum
60 || regnum == tdep->ppc_xer_regnum
61 || regnum == tdep->ppc_ctr_regnum
206988c4 62 || regnum == gdbarch_pc_regnum (gdbarch));
e42180d7
C
63}
64
485721b1 65/* Like above, but for PT_GETFPREGS. */
def18405 66
485721b1 67static int
206988c4 68getfpregs_supplies (struct gdbarch *gdbarch, int regnum)
e42180d7 69{
206988c4 70 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
e42180d7 71
383f0f5b
JB
72 /* FIXME: jimb/2004-05-05: Some PPC variants don't have floating
73 point registers. Traditionally, GDB's register set has still
74 listed the floating point registers for such machines, so this
75 code is harmless. However, the new E500 port actually omits the
76 floating point registers entirely from the register set --- they
77 don't even have register numbers assigned to them.
78
79 It's not clear to me how best to update this code, so this assert
80 will alert the first person to encounter the NetBSD/E500
81 combination to the problem. */
206988c4 82 gdb_assert (ppc_floating_point_unit_p (gdbarch));
383f0f5b 83
def18405
MK
84 return ((regnum >= tdep->ppc_fp0_regnum
85 && regnum < tdep->ppc_fp0_regnum + ppc_num_fprs)
86 || regnum == tdep->ppc_fpscr_regnum);
485721b1 87}
e42180d7 88
f6ac5f3d
PA
89void
90ppc_nbsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
e42180d7 91{
ac7936df 92 struct gdbarch *gdbarch = regcache->arch ();
e99b03dc 93 pid_t pid = regcache->ptid ().pid ();
206988c4
MD
94
95 if (regnum == -1 || getregs_supplies (gdbarch, regnum))
485721b1
JT
96 {
97 struct reg regs;
98
bcc0c096 99 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 100 perror_with_name (_("Couldn't get registers"));
485721b1 101
56be3814 102 ppc_supply_gregset (&ppcnbsd_gregset, regcache,
def18405 103 regnum, &regs, sizeof regs);
485721b1
JT
104 }
105
206988c4 106 if (regnum == -1 || getfpregs_supplies (gdbarch, regnum))
485721b1
JT
107 {
108 struct fpreg fpregs;
109
bcc0c096 110 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 111 perror_with_name (_("Couldn't get FP registers"));
485721b1 112
56be3814 113 ppc_supply_fpregset (&ppcnbsd_fpregset, regcache,
def18405 114 regnum, &fpregs, sizeof fpregs);
485721b1 115 }
e42180d7
C
116}
117
f6ac5f3d
PA
118void
119ppc_nbsd_nat_target::store_registers (struct regcache *regcache, int regnum)
e42180d7 120{
ac7936df 121 struct gdbarch *gdbarch = regcache->arch ();
e99b03dc 122 pid_t pid = regcache->ptid ().pid ();
206988c4
MD
123
124 if (regnum == -1 || getregs_supplies (gdbarch, regnum))
485721b1
JT
125 {
126 struct reg regs;
127
bcc0c096 128 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 129 perror_with_name (_("Couldn't get registers"));
485721b1 130
56be3814 131 ppc_collect_gregset (&ppcnbsd_gregset, regcache,
def18405 132 regnum, &regs, sizeof regs);
485721b1 133
bcc0c096 134 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 135 perror_with_name (_("Couldn't write registers"));
485721b1
JT
136 }
137
206988c4 138 if (regnum == -1 || getfpregs_supplies (gdbarch, regnum))
485721b1
JT
139 {
140 struct fpreg fpregs;
141
bcc0c096 142 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 143 perror_with_name (_("Couldn't get FP registers"));
485721b1 144
56be3814 145 ppc_collect_fpregset (&ppcnbsd_fpregset, regcache,
def18405
MK
146 regnum, &fpregs, sizeof fpregs);
147
bcc0c096 148 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 149 perror_with_name (_("Couldn't set FP registers"));
485721b1 150 }
e42180d7 151}
69e9e646
NW
152
153static int
154ppcnbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
155{
156 struct switchframe sf;
157 struct callframe cf;
ac7936df 158 struct gdbarch *gdbarch = regcache->arch ();
40a6adc1 159 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
69e9e646
NW
160 int i;
161
162 /* The stack pointer shouldn't be zero. */
163 if (pcb->pcb_sp == 0)
164 return 0;
165
def18405 166 read_memory (pcb->pcb_sp, (gdb_byte *)&sf, sizeof sf);
73e1c03f
SM
167 regcache->raw_supply (tdep->ppc_cr_regnum, &sf.cr);
168 regcache->raw_supply (tdep->ppc_gp0_regnum + 2, &sf.fixreg2);
69e9e646 169 for (i = 0 ; i < 19 ; i++)
73e1c03f 170 regcache->raw_supply (tdep->ppc_gp0_regnum + 13 + i, &sf.fixreg[i]);
69e9e646 171
def18405 172 read_memory(sf.sp, (gdb_byte *)&cf, sizeof(cf));
73e1c03f
SM
173 regcache->raw_supply (tdep->ppc_gp0_regnum + 30, &cf.r30);
174 regcache->raw_supply (tdep->ppc_gp0_regnum + 31, &cf.r31);
175 regcache->raw_supply (tdep->ppc_gp0_regnum + 1, &cf.sp);
69e9e646 176
def18405 177 read_memory(cf.sp, (gdb_byte *)&cf, sizeof(cf));
73e1c03f
SM
178 regcache->raw_supply (tdep->ppc_lr_regnum, &cf.lr);
179 regcache->raw_supply (gdbarch_pc_regnum (gdbarch), &cf.lr);
69e9e646
NW
180
181 return 1;
182}
183
6c265988 184void _initialize_ppcnbsd_nat ();
69e9e646 185void
6c265988 186_initialize_ppcnbsd_nat ()
69e9e646
NW
187{
188 /* Support debugging kernel virtual memory images. */
189 bsd_kvm_add_target (ppcnbsd_supply_pcb);
def18405 190
d9f719f1 191 add_inf_child_target (&the_ppc_nbsd_nat_target);
69e9e646 192}
This page took 1.77442 seconds and 4 git commands to generate.