GDB (xrefs)
/tmp/gdb-8.1/gdb/hppa-linux-nat.c
Go to the documentation of this file.
1 /* Functions specific to running GDB native on HPPA running GNU/Linux.
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 "regcache.h"
23 #include "inferior.h"
24 #include "target.h"
25 #include "linux-nat.h"
26 #include "inf-ptrace.h"
27 
28 #include <sys/procfs.h>
29 #include "nat/gdb_ptrace.h"
30 #include <linux/version.h>
31 
32 #include <asm/ptrace.h>
33 #include "hppa-linux-offsets.h"
34 
35 #include "hppa-tdep.h"
36 
37 /* Prototypes for supply_gregset etc. */
38 #include "gregset.h"
39 
40 /* These must match the order of the register names.
41 
42  Some sort of lookup table is needed because the offsets associated
43  with the registers are all over the board. */
44 
45 static const int u_offsets[] =
46  {
47  /* general registers */
48  -1,
49  PT_GR1,
50  PT_GR2,
51  PT_GR3,
52  PT_GR4,
53  PT_GR5,
54  PT_GR6,
55  PT_GR7,
56  PT_GR8,
57  PT_GR9,
58  PT_GR10,
59  PT_GR11,
60  PT_GR12,
61  PT_GR13,
62  PT_GR14,
63  PT_GR15,
64  PT_GR16,
65  PT_GR17,
66  PT_GR18,
67  PT_GR19,
68  PT_GR20,
69  PT_GR21,
70  PT_GR22,
71  PT_GR23,
72  PT_GR24,
73  PT_GR25,
74  PT_GR26,
75  PT_GR27,
76  PT_GR28,
77  PT_GR29,
78  PT_GR30,
79  PT_GR31,
80 
81  PT_SAR,
82  PT_IAOQ0,
83  PT_IASQ0,
84  PT_IAOQ1,
85  PT_IASQ1,
86  -1, /* eiem */
87  PT_IIR,
88  PT_ISR,
89  PT_IOR,
90  PT_PSW,
91  -1, /* goto */
92 
93  PT_SR4,
94  PT_SR0,
95  PT_SR1,
96  PT_SR2,
97  PT_SR3,
98  PT_SR5,
99  PT_SR6,
100  PT_SR7,
101 
102  -1, /* cr0 */
103  -1, /* pid0 */
104  -1, /* pid1 */
105  -1, /* ccr */
106  -1, /* pid2 */
107  -1, /* pid3 */
108  -1, /* cr24 */
109  -1, /* cr25 */
110  -1, /* cr26 */
111  PT_CR27,
112  -1, /* cr28 */
113  -1, /* cr29 */
114  -1, /* cr30 */
115 
116  /* Floating point regs. */
117  PT_FR0, PT_FR0 + 4,
118  PT_FR1, PT_FR1 + 4,
119  PT_FR2, PT_FR2 + 4,
120  PT_FR3, PT_FR3 + 4,
121  PT_FR4, PT_FR4 + 4,
122  PT_FR5, PT_FR5 + 4,
123  PT_FR6, PT_FR6 + 4,
124  PT_FR7, PT_FR7 + 4,
125  PT_FR8, PT_FR8 + 4,
126  PT_FR9, PT_FR9 + 4,
127  PT_FR10, PT_FR10 + 4,
128  PT_FR11, PT_FR11 + 4,
129  PT_FR12, PT_FR12 + 4,
130  PT_FR13, PT_FR13 + 4,
131  PT_FR14, PT_FR14 + 4,
132  PT_FR15, PT_FR15 + 4,
133  PT_FR16, PT_FR16 + 4,
134  PT_FR17, PT_FR17 + 4,
135  PT_FR18, PT_FR18 + 4,
136  PT_FR19, PT_FR19 + 4,
137  PT_FR20, PT_FR20 + 4,
138  PT_FR21, PT_FR21 + 4,
139  PT_FR22, PT_FR22 + 4,
140  PT_FR23, PT_FR23 + 4,
141  PT_FR24, PT_FR24 + 4,
142  PT_FR25, PT_FR25 + 4,
143  PT_FR26, PT_FR26 + 4,
144  PT_FR27, PT_FR27 + 4,
145  PT_FR28, PT_FR28 + 4,
146  PT_FR29, PT_FR29 + 4,
147  PT_FR30, PT_FR30 + 4,
148  PT_FR31, PT_FR31 + 4,
149  };
150 
151 static CORE_ADDR
152 hppa_linux_register_addr (int regno, CORE_ADDR blockend)
153 {
154  CORE_ADDR addr;
155 
156  if ((unsigned) regno >= ARRAY_SIZE (u_offsets))
157  error (_("Invalid register number %d."), regno);
158 
159  if (u_offsets[regno] == -1)
160  addr = 0;
161  else
162  {
163  addr = (CORE_ADDR) u_offsets[regno];
164  }
165 
166  return addr;
167 }
168 
169 /*
170  * Registers saved in a coredump:
171  * gr0..gr31
172  * sr0..sr7
173  * iaoq0..iaoq1
174  * iasq0..iasq1
175  * sar, iir, isr, ior, ipsw
176  * cr0, cr24..cr31
177  * cr8,9,12,13
178  * cr10, cr15
179  */
180 #define GR_REGNUM(_n) (HPPA_R0_REGNUM+_n)
181 #define TR_REGNUM(_n) (HPPA_TR0_REGNUM+_n)
182 static const int greg_map[] =
183  {
184  GR_REGNUM(0), GR_REGNUM(1), GR_REGNUM(2), GR_REGNUM(3),
185  GR_REGNUM(4), GR_REGNUM(5), GR_REGNUM(6), GR_REGNUM(7),
186  GR_REGNUM(8), GR_REGNUM(9), GR_REGNUM(10), GR_REGNUM(11),
187  GR_REGNUM(12), GR_REGNUM(13), GR_REGNUM(14), GR_REGNUM(15),
188  GR_REGNUM(16), GR_REGNUM(17), GR_REGNUM(18), GR_REGNUM(19),
189  GR_REGNUM(20), GR_REGNUM(21), GR_REGNUM(22), GR_REGNUM(23),
190  GR_REGNUM(24), GR_REGNUM(25), GR_REGNUM(26), GR_REGNUM(27),
191  GR_REGNUM(28), GR_REGNUM(29), GR_REGNUM(30), GR_REGNUM(31),
192 
195 
198 
201 
202  TR_REGNUM(0), TR_REGNUM(1), TR_REGNUM(2), TR_REGNUM(3),
203  TR_REGNUM(4), TR_REGNUM(5), TR_REGNUM(6), TR_REGNUM(7),
204 
207  };
208 
209 
210 
211 /* Fetch one register. */
212 
213 static void
214 fetch_register (struct regcache *regcache, int regno)
215 {
216  struct gdbarch *gdbarch = regcache->arch ();
217  pid_t tid;
218  int val;
219 
221  {
222  regcache_raw_supply (regcache, regno, NULL);
223  return;
224  }
225 
227 
228  errno = 0;
229  val = ptrace (PTRACE_PEEKUSER, tid, hppa_linux_register_addr (regno, 0), 0);
230  if (errno != 0)
231  error (_("Couldn't read register %s (#%d): %s."),
233  regno, safe_strerror (errno));
234 
235  regcache_raw_supply (regcache, regno, &val);
236 }
237 
238 /* Store one register. */
239 
240 static void
241 store_register (const struct regcache *regcache, int regno)
242 {
243  struct gdbarch *gdbarch = regcache->arch ();
244  pid_t tid;
245  int val;
246 
248  return;
249 
251 
252  errno = 0;
253  regcache_raw_collect (regcache, regno, &val);
254  ptrace (PTRACE_POKEUSER, tid, hppa_linux_register_addr (regno, 0), val);
255  if (errno != 0)
256  error (_("Couldn't write register %s (#%d): %s."),
258  regno, safe_strerror (errno));
259 }
260 
261 /* Fetch registers from the child process. Fetch all registers if
262  regno == -1, otherwise fetch all general registers or all floating
263  point registers depending upon the value of regno. */
264 
265 static void
267  struct regcache *regcache, int regno)
268 {
269  if (-1 == regno)
270  {
271  for (regno = 0;
272  regno < gdbarch_num_regs (regcache->arch ());
273  regno++)
274  fetch_register (regcache, regno);
275  }
276  else
277  {
278  fetch_register (regcache, regno);
279  }
280 }
281 
282 /* Store registers back into the inferior. Store all registers if
283  regno == -1, otherwise store all general registers or all floating
284  point registers depending upon the value of regno. */
285 
286 static void
288  struct regcache *regcache, int regno)
289 {
290  if (-1 == regno)
291  {
292  for (regno = 0;
293  regno < gdbarch_num_regs (regcache->arch ());
294  regno++)
295  store_register (regcache, regno);
296  }
297  else
298  {
299  store_register (regcache, regno);
300  }
301 }
302 
303 /* Fill GDB's register array with the general-purpose register values
304  in *gregsetp. */
305 
306 void
307 supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
308 {
309  int i;
310  const greg_t *regp = (const elf_greg_t *) gregsetp;
311 
312  for (i = 0; i < sizeof (greg_map) / sizeof (greg_map[0]); i++, regp++)
313  {
314  int regno = greg_map[i];
315  regcache_raw_supply (regcache, regno, regp);
316  }
317 }
318 
319 /* Fill register regno (if it is a general-purpose register) in
320  *gregsetp with the appropriate value from GDB's register array.
321  If regno is -1, do this for all registers. */
322 
323 void
325  gdb_gregset_t *gregsetp, int regno)
326 {
327  int i;
328 
329  for (i = 0; i < sizeof (greg_map) / sizeof (greg_map[0]); i++)
330  {
331  int mregno = greg_map[i];
332 
333  if (regno == -1 || regno == mregno)
334  {
335  regcache_raw_collect(regcache, mregno, &(*gregsetp)[i]);
336  }
337  }
338 }
339 
340 /* Given a pointer to a floating point register set in /proc format
341  (fpregset_t *), unpack the register contents and supply them as gdb's
342  idea of the current floating point register values. */
343 
344 void
345 supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
346 {
347  int regi;
348  const char *from;
349 
350  for (regi = 0; regi <= 31; regi++)
351  {
352  from = (const char *) &((*fpregsetp)[regi]);
353  regcache_raw_supply (regcache, 2*regi + HPPA_FP0_REGNUM, from);
354  regcache_raw_supply (regcache, 2*regi + HPPA_FP0_REGNUM + 1, from + 4);
355  }
356 }
357 
358 /* Given a pointer to a floating point register set in /proc format
359  (fpregset_t *), update the register specified by REGNO from gdb's idea
360  of the current floating point register set. If REGNO is -1, update
361  them all. */
362 
363 void
365  gdb_fpregset_t *fpregsetp, int regno)
366 {
367  int i;
368 
369  for (i = HPPA_FP0_REGNUM; i < HPPA_FP0_REGNUM + 32 * 2; i++)
370  {
371  /* Gross. fpregset_t is double, registers[x] has single
372  precision reg. */
373  char *to = (char *) &((*fpregsetp)[(i - HPPA_FP0_REGNUM) / 2]);
374  if ((i - HPPA_FP0_REGNUM) & 1)
375  to += 4;
377  }
378 }
379 
380 void
382 {
383  struct target_ops *t;
384 
385  /* Fill in the generic GNU/Linux methods. */
386  t = linux_target ();
387 
388  /* Add our register access methods. */
391 
392  /* Register the target. */
394 }
void _initialize_hppa_linux_nat(void)
static constexpr ptid_t tid
#define PT_GR26
#define PT_FR26
#define PT_GR3
#define PT_GR19
void supply_fpregset(struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
#define PT_GR20
#define PT_GR16
bfd_vma CORE_ADDR
Definition: common-types.h:41
#define PT_GR14
#define PT_FR6
static void store_register(const struct regcache *regcache, int regno)
#define PT_SR2
ptid_t regcache_get_ptid(const struct regcache *regcache)
Definition: regcache.c:229
#define PT_FR23
#define PT_FR1
#define PT_PSW
#define PT_FR19
#define PT_GR31
#define PT_FR28
#define PT_SR4
#define PT_FR20
#define PT_FR0
void fill_gregset(const struct regcache *regcache, gdb_gregset_t *gregsetp, int regno)
static const int u_offsets[]
int gdbarch_num_regs(struct gdbarch *gdbarch)
Definition: gdbarch.c:2039
#define _(String)
Definition: gdb_locale.h:35
#define PT_FR21
#define PT_GR9
#define PT_GR24
PTRACE_TYPE_RET ptrace()
#define PT_GR7
#define PT_GR8
#define PT_FR3
void supply_gregset(struct regcache *regcache, const gdb_gregset_t *gregsetp)
#define PT_FR15
#define PT_GR21
#define PT_FR5
#define PT_FR31
#define GR_REGNUM(_n)
#define PT_GR25
static const int greg_map[]
#define PT_GR12
#define PT_GR15
#define PT_FR30
#define PT_GR18
#define PT_GR11
#define PT_FR29
#define PT_SR1
GDB_GREGSET_T gdb_gregset_t
Definition: gregset.h:34
int gdbarch_cannot_store_register(struct gdbarch *gdbarch, int regnum)
Definition: gdbarch.c:2538
#define PT_IOR
int gdbarch_cannot_fetch_register(struct gdbarch *gdbarch, int regnum)
Definition: gdbarch.c:2521
GDB_FPREGSET_T gdb_fpregset_t
Definition: gregset.h:35
#define PT_FR8
#define PT_GR22
#define PT_FR25
#define PT_SR0
#define PT_SR6
#define PT_FR12
#define PT_GR6
#define PT_GR4
const char * gdbarch_register_name(struct gdbarch *gdbarch, int regnr)
Definition: gdbarch.c:2282
void linux_nat_add_target(struct target_ops *t)
Definition: linux-nat.c:4804
#define PT_GR29
#define PT_FR17
void fill_fpregset(const struct regcache *regcache, gdb_fpregset_t *fpregsetp, int regno)
#define PT_FR11
static void fetch_register(struct regcache *regcache, int regno)
#define PT_FR24
#define PT_GR13
static CORE_ADDR hppa_linux_register_addr(int regno, CORE_ADDR blockend)
struct target_ops * linux_target(void)
Definition: linux-nat.c:4377
#define PT_GR10
#define PT_IIR
#define PT_GR30
static void hppa_linux_store_inferior_registers(struct target_ops *ops, struct regcache *regcache, int regno)
#define PT_FR14
#define PT_FR7
#define PT_FR10
#define PT_IASQ0
#define TR_REGNUM(_n)
#define PT_IASQ1
void(* to_fetch_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_IGNORE()
Definition: target.h:457
#define PT_FR9
#define PT_SAR
#define PT_FR18
#define PT_FR2
#define PT_SR7
#define PT_GR17
#define PT_GR5
char * safe_strerror(int)
static void hppa_linux_fetch_inferior_registers(struct target_ops *ops, struct regcache *regcache, int regno)
#define PT_IAOQ0
gdbarch * arch() const
Definition: regcache.c:221
#define PT_FR4
#define PT_FR13
#define PT_GR1
#define PT_GR28
#define PT_GR23
#define PT_SR5
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
Definition: regcache.c:1004
#define PT_FR22
#define PT_FR27
void regcache_raw_collect(const struct regcache *regcache, int regnum, void *buf)
Definition: regcache.c:1085
#define PT_FR16
pid_t get_ptrace_pid(ptid_t ptid)
Definition: inf-ptrace.c:320
#define PT_IAOQ1
void(* to_store_registers)(struct target_ops *, struct regcache *, int) TARGET_DEFAULT_NORETURN(noprocess())
Definition: target.h:459
#define PT_CR27
#define PT_GR27
void error(const char *fmt,...)
Definition: errors.c:38
#define PT_ISR
#define PT_SR3
#define PT_GR2