GDB (xrefs)
/tmp/gdb-8.1/gdb/m68k-bsd-nat.c
Go to the documentation of this file.
1 /* Native-dependent code for Motorola 68000 BSD's.
2 
3  Copyright (C) 2004-2018 Free Software Foundation, Inc.
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
9  the Free Software Foundation; either version 3 of the License, or
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
18  along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 
20 #include "defs.h"
21 #include "gdbcore.h"
22 #include "inferior.h"
23 #include "regcache.h"
24 
25 #include <sys/types.h>
26 #include <sys/ptrace.h>
27 #include <machine/reg.h>
28 
29 #include "m68k-tdep.h"
30 #include "inf-ptrace.h"
31 
32 static int
34 {
35  return (regnum >= M68K_D0_REGNUM && regnum <= M68K_PC_REGNUM);
36 }
37 
38 static int
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 
46 static void
47 m68kbsd_supply_gregset (struct regcache *regcache, const void *gregs)
48 {
49  const char *regs = gregs;
50  int regnum;
51 
54 }
55 
56 /* Supply the floating-point registers stored in FPREGS to REGCACHE. */
57 
58 static void
59 m68kbsd_supply_fpregset (struct regcache *regcache, const void *fpregs)
60 {
61  struct gdbarch *gdbarch = regcache->arch ();
62  const char *regs = fpregs;
63  int regnum;
64 
68 }
69 
70 /* Collect the general-purpose registers from REGCACHE and store them
71  in GREGS. */
72 
73 static void
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)
83  regcache_raw_collect (regcache, i, regs + i * 4);
84  }
85 }
86 
87 /* Collect the floating-point registers from REGCACHE and store them
88  in FPREGS. */
89 
90 static void
92  void *fpregs, int regnum)
93 {
94  struct gdbarch *gdbarch = regcache->arch ();
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)
102  regs + m68kbsd_fpreg_offset (gdbarch, i));
103  }
104 }
105 
106 
107 /* Fetch register REGNUM from the inferior. If REGNUM is -1, do this
108  for all registers (including the floating-point registers). */
109 
110 static void
112  struct regcache *regcache, int regnum)
113 {
115 
117  {
118  struct reg regs;
119 
120  if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
121  perror_with_name (_("Couldn't get registers"));
122 
124  }
125 
127  {
128  struct fpreg fpregs;
129 
130  if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
131  perror_with_name (_("Couldn't get floating point status"));
132 
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 
140 static void
142  struct regcache *regcache, int regnum)
143 {
145 
147  {
148  struct reg regs;
149 
150  if (ptrace (PT_GETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
151  perror_with_name (_("Couldn't get registers"));
152 
154 
155  if (ptrace (PT_SETREGS, pid, (PTRACE_TYPE_ARG3) &regs, 0) == -1)
156  perror_with_name (_("Couldn't write registers"));
157  }
158 
160  {
161  struct fpreg fpregs;
162 
163  if (ptrace (PT_GETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
164  perror_with_name (_("Couldn't get floating point status"));
165 
167 
168  if (ptrace (PT_SETFPREGS, pid, (PTRACE_TYPE_ARG3) &fpregs, 0) == -1)
169  perror_with_name (_("Couldn't write floating point status"));
170  }
171 }
172 
173 
174 /* Support for debugging kernel virtual memory images. */
175 
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 
188 static int
189 m68kbsd_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 
206  regcache_raw_supply (regcache, regnum, &pcb->pcb_regs[i++]);
208  regcache_raw_supply (regcache, regnum, &pcb->pcb_regs[i++]);
209 
210  tmp = pcb->pcb_ps & 0xffff;
212 
213  read_memory (pcb->pcb_regs[PCB_REGS_FP] + 4, (char *) &tmp, sizeof tmp);
215 
216  return 1;
217 }
218 
219 void
221 {
222  struct target_ops *t;
223 
224  t = inf_ptrace_target ();
227  add_target (t);
228 
229  /* Support debugging kernel virtual memory images. */
231 }
void add_target(struct target_ops *t)
Definition: target.c:395
static int m68kbsd_gregset_supplies_p(int regnum)
Definition: m68k-bsd-nat.c:33
static void m68kbsd_store_inferior_registers(struct target_ops *ops, struct regcache *regcache, int regnum)
Definition: m68k-bsd-nat.c:141
static int m68kbsd_supply_pcb(struct regcache *regcache, struct pcb *pcb)
Definition: m68k-bsd-nat.c:189
int ptid_get_pid(const ptid_t &ptid)
Definition: ptid.c:47
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
Definition: gnu-nat.c:1824
#define PCB_REGS_SP
Definition: m68k-bsd-nat.c:185
ptid_t regcache_get_ptid(const struct regcache *regcache)
Definition: regcache.c:229
void _initialize_m68kbsd_nat(void)
Definition: m68k-bsd-nat.c:220
static void m68kbsd_collect_gregset(const struct regcache *regcache, void *gregs, int regnum)
Definition: m68k-bsd-nat.c:74
#define _(String)
Definition: gdb_locale.h:35
struct target_ops * inf_ptrace_target(void)
Definition: inf-ptrace.c:676
PTRACE_TYPE_RET ptrace()
static void m68kbsd_fetch_inferior_registers(struct target_ops *ops, struct regcache *regcache, int regnum)
Definition: m68k-bsd-nat.c:111
int m68kbsd_fpreg_offset(struct gdbarch *gdbarch, int regnum)
Definition: m68k-bsd-tdep.c:42
static int m68kbsd_fpregset_supplies_p(int regnum)
Definition: m68k-bsd-nat.c:39
int regnum
Definition: aarch64-tdep.c:77
void read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
Definition: corefile.c:258
static void m68kbsd_supply_fpregset(struct regcache *regcache, const void *fpregs)
Definition: m68k-bsd-nat.c:59
Definition: regdef.h:22
static void m68kbsd_collect_fpregset(struct regcache *regcache, void *fpregs, int regnum)
Definition: m68k-bsd-nat.c:91
void(* to_fetch_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_IGNORE()
Definition: target.h:457
void void void void void void void void void perror_with_name(const char *string) ATTRIBUTE_NORETURN
Definition: utils.c:692
gdbarch * arch() const
Definition: regcache.c:221
static void m68kbsd_supply_gregset(struct regcache *regcache, const void *gregs)
Definition: m68k-bsd-nat.c:47
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
Definition: regcache.c:1004
#define PCB_REGS_FP
Definition: m68k-bsd-nat.c:182
void regcache_raw_collect(const struct regcache *regcache, int regnum, void *buf)
Definition: regcache.c:1085
#define PTRACE_TYPE_ARG3
Definition: config.h:642
void bsd_kvm_add_target(int(*supply_pcb)(struct regcache *, struct pcb *))
Definition: bsd-kvm.c:354
void(* to_store_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_NORETURN(noprocess())
Definition: target.h:459