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