Define _KERNTYPES in m68k-bsd-nat.c
[deliverable/binutils-gdb.git] / gdb / m68k-bsd-nat.c
CommitLineData
8f2d3ea0
MK
1/* Native-dependent code for Motorola 68000 BSD's.
2
b811d2c2 3 Copyright (C) 2004-2020 Free Software Foundation, Inc.
8f2d3ea0
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
8f2d3ea0
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/>. */
8f2d3ea0 19
f90280ca
KR
20/* We define this to get types like register_t. */
21#define _KERNTYPES
8f2d3ea0 22#include "defs.h"
cb162ff6 23#include "gdbcore.h"
8f2d3ea0
MK
24#include "inferior.h"
25#include "regcache.h"
26
8f2d3ea0
MK
27#include <sys/types.h>
28#include <sys/ptrace.h>
29#include <machine/reg.h>
30
31#include "m68k-tdep.h"
bcfca652 32#include "inf-ptrace.h"
8f2d3ea0 33
f6ac5f3d
PA
34struct m68k_bsd_nat_target final : public inf_ptrace_target
35{
36 void fetch_registers (struct regcache *, int) override;
37 void store_registers (struct regcache *, int) override;
38};
39
40static m68k_bsd_nat_target the_m68k_bsd_nat_target;
41
8f2d3ea0
MK
42static int
43m68kbsd_gregset_supplies_p (int regnum)
44{
45 return (regnum >= M68K_D0_REGNUM && regnum <= M68K_PC_REGNUM);
46}
47
48static int
49m68kbsd_fpregset_supplies_p (int regnum)
50{
51 return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FPI_REGNUM);
52}
53
54/* Supply the general-purpose registers stored in GREGS to REGCACHE. */
55
56static void
57m68kbsd_supply_gregset (struct regcache *regcache, const void *gregs)
58{
59 const char *regs = gregs;
60 int regnum;
61
62 for (regnum = M68K_D0_REGNUM; regnum <= M68K_PC_REGNUM; regnum++)
73e1c03f 63 regcache->raw_supply (regnum, regs + regnum * 4);
8f2d3ea0
MK
64}
65
66/* Supply the floating-point registers stored in FPREGS to REGCACHE. */
67
68static void
69m68kbsd_supply_fpregset (struct regcache *regcache, const void *fpregs)
70{
ac7936df 71 struct gdbarch *gdbarch = regcache->arch ();
8f2d3ea0
MK
72 const char *regs = fpregs;
73 int regnum;
74
75 for (regnum = M68K_FP0_REGNUM; regnum <= M68K_FPI_REGNUM; regnum++)
73e1c03f
SM
76 regcache->raw_supply (regnum,
77 regs + m68kbsd_fpreg_offset (gdbarch, regnum));
8f2d3ea0
MK
78}
79
80/* Collect the general-purpose registers from REGCACHE and store them
81 in GREGS. */
82
83static void
84m68kbsd_collect_gregset (const struct regcache *regcache,
85 void *gregs, int regnum)
86{
87 char *regs = gregs;
88 int i;
89
90 for (i = M68K_D0_REGNUM; i <= M68K_PC_REGNUM; i++)
91 {
92 if (regnum == -1 || regnum == i)
34a79281 93 regcache->raw_collect (i, regs + i * 4);
8f2d3ea0
MK
94 }
95}
96
97/* Collect the floating-point registers from REGCACHE and store them
98 in FPREGS. */
99
100static void
101m68kbsd_collect_fpregset (struct regcache *regcache,
102 void *fpregs, int regnum)
103{
ac7936df 104 struct gdbarch *gdbarch = regcache->arch ();
8f2d3ea0
MK
105 char *regs = fpregs;
106 int i;
107
108 for (i = M68K_FP0_REGNUM; i <= M68K_FPI_REGNUM; i++)
109 {
110 if (regnum == -1 || regnum == i)
34a79281 111 regcache->raw_collect (i, regs + m68kbsd_fpreg_offset (gdbarch, i));
8f2d3ea0
MK
112 }
113}
114\f
115
116/* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
117 for all registers (including the floating-point registers). */
118
f6ac5f3d
PA
119void
120m68k_bsd_nat_target::fetch_registers (struct regcache *regcache, int regnum)
8f2d3ea0 121{
e99b03dc 122 pid_t pid = regcache->ptid ().pid ();
bcc0c096 123
8f2d3ea0
MK
124 if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum))
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"));
8f2d3ea0 130
56be3814 131 m68kbsd_supply_gregset (regcache, &regs);
8f2d3ea0
MK
132 }
133
134 if (regnum == -1 || m68kbsd_fpregset_supplies_p (regnum))
135 {
136 struct fpreg fpregs;
137
bcc0c096 138 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 139 perror_with_name (_("Couldn't get floating point status"));
8f2d3ea0 140
56be3814 141 m68kbsd_supply_fpregset (regcache, &fpregs);
8f2d3ea0
MK
142 }
143}
144
145/* Store register REGNUM back into the inferior. If REGNUM is -1, do
146 this for all registers (including the floating-point registers). */
147
f6ac5f3d
PA
148void
149m68k_bsd_nat_target::store_registers (struct regcache *regcache, int regnum)
8f2d3ea0 150{
e99b03dc 151 pid_t pid = regcache->ptid ().pid ();
bcc0c096 152
8f2d3ea0
MK
153 if (regnum == -1 || m68kbsd_gregset_supplies_p (regnum))
154 {
155 struct reg regs;
156
bcc0c096 157 if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 158 perror_with_name (_("Couldn't get registers"));
8f2d3ea0 159
56be3814 160 m68kbsd_collect_gregset (regcache, &regs, regnum);
8f2d3ea0 161
bcc0c096 162 if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
e2e0b3e5 163 perror_with_name (_("Couldn't write registers"));
8f2d3ea0
MK
164 }
165
166 if (regnum == -1 || m68kbsd_fpregset_supplies_p (regnum))
167 {
168 struct fpreg fpregs;
169
bcc0c096 170 if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 171 perror_with_name (_("Couldn't get floating point status"));
8f2d3ea0 172
56be3814 173 m68kbsd_collect_fpregset (regcache, &fpregs, regnum);
8f2d3ea0 174
bcc0c096 175 if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
e2e0b3e5 176 perror_with_name (_("Couldn't write floating point status"));
8f2d3ea0
MK
177 }
178}
cb162ff6
MK
179\f
180
181/* Support for debugging kernel virtual memory images. */
182
cb162ff6
MK
183#include <machine/pcb.h>
184
185#include "bsd-kvm.h"
186
187/* OpenBSD doesn't have these. */
188#ifndef PCB_REGS_FP
189#define PCB_REGS_FP 10
190#endif
191#ifndef PCB_REGS_SP
192#define PCB_REGS_SP 11
193#endif
194
195static int
196m68kbsd_supply_pcb (struct regcache *regcache, struct pcb *pcb)
197{
198 int regnum, tmp;
199 int i = 0;
200
201 /* The following is true for NetBSD 1.6.2:
202
203 The pcb contains %d2...%d7, %a2...%a7 and %ps. This accounts for
204 all callee-saved registers. From this information we reconstruct
205 the register state as it would look when we just returned from
206 cpu_switch(). */
207
208 /* The stack pointer shouldn't be zero. */
209 if (pcb->pcb_regs[PCB_REGS_SP] == 0)
210 return 0;
211
212 for (regnum = M68K_D2_REGNUM; regnum <= M68K_D7_REGNUM; regnum++)
73e1c03f 213 regcache->raw_supply (regnum, &pcb->pcb_regs[i++]);
cb162ff6 214 for (regnum = M68K_A2_REGNUM; regnum <= M68K_SP_REGNUM; regnum++)
73e1c03f 215 regcache->raw_supply (regnum, &pcb->pcb_regs[i++]);
cb162ff6
MK
216
217 tmp = pcb->pcb_ps & 0xffff;
73e1c03f 218 regcache->raw_supply (M68K_PS_REGNUM, &tmp);
cb162ff6
MK
219
220 read_memory (pcb->pcb_regs[PCB_REGS_FP] + 4, (char *) &tmp, sizeof tmp);
73e1c03f 221 regcache->raw_supply (M68K_PC_REGNUM, &tmp);
cb162ff6
MK
222
223 return 1;
224}
cb162ff6 225
6c265988 226void _initialize_m68kbsd_nat ();
cb162ff6 227void
6c265988 228_initialize_m68kbsd_nat ()
cb162ff6 229{
d9f719f1 230 add_inf_child_target (&the_m68k_bsd_nat_target);
abbc6945 231
cb162ff6
MK
232 /* Support debugging kernel virtual memory images. */
233 bsd_kvm_add_target (m68kbsd_supply_pcb);
234}
This page took 1.388831 seconds and 4 git commands to generate.