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