GDB (xrefs)
/tmp/gdb-8.1/gdb/ppc-nbsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for NetBSD/powerpc.
2 
3  Copyright (C) 2002-2018 Free Software Foundation, Inc.
4 
5  Contributed by Wasabi Systems, Inc.
6 
7  This file is part of GDB.
8 
9  This program is free software; you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation; either version 3 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 
22 #include "defs.h"
23 #include "gdbtypes.h"
24 #include "osabi.h"
25 #include "regcache.h"
26 #include "regset.h"
27 #include "trad-frame.h"
28 #include "tramp-frame.h"
29 
30 #include "ppc-tdep.h"
31 #include "ppc-nbsd-tdep.h"
32 #include "solib-svr4.h"
33 
34 /* Register offsets from <machine/reg.h>. */
36 
37 
38 /* Core file support. */
39 
40 /* NetBSD/powerpc register sets. */
41 
42 const struct regset ppcnbsd_gregset =
43 {
46 };
47 
48 const struct regset ppcnbsd_fpregset =
49 {
52 };
53 
54 /* Iterate over core file register note sections. */
55 
56 static void
59  void *cb_data,
60  const struct regcache *regcache)
61 {
62  cb (".reg", 148, &ppcnbsd_gregset, NULL, cb_data);
63  cb (".reg2", 264, &ppcnbsd_fpregset, NULL, cb_data);
64 }
65 
66 
67 /* NetBSD is confused. It appears that 1.5 was using the correct SVR4
68  convention but, 1.6 switched to the below broken convention. For
69  the moment use the broken convention. Ulgh! */
70 
71 static enum return_value_convention
72 ppcnbsd_return_value (struct gdbarch *gdbarch, struct value *function,
73  struct type *valtype, struct regcache *regcache,
74  gdb_byte *readbuf, const gdb_byte *writebuf)
75 {
76 #if 0
77  if ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
78  || TYPE_CODE (valtype) == TYPE_CODE_UNION)
79  && !((TYPE_LENGTH (valtype) == 16 || TYPE_LENGTH (valtype) == 8)
80  && TYPE_VECTOR (valtype))
81  && !(TYPE_LENGTH (valtype) == 1
82  || TYPE_LENGTH (valtype) == 2
83  || TYPE_LENGTH (valtype) == 4
84  || TYPE_LENGTH (valtype) == 8))
86  else
87 #endif
88  return ppc_sysv_abi_broken_return_value (gdbarch, function, valtype,
89  regcache, readbuf, writebuf);
90 }
91 
92 
93 /* Signal trampolines. */
94 
95 extern const struct tramp_frame ppcnbsd2_sigtramp;
96 
97 static void
99  struct frame_info *this_frame,
100  struct trad_frame_cache *this_cache,
101  CORE_ADDR func)
102 {
103  struct gdbarch *gdbarch = get_frame_arch (this_frame);
104  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
105  CORE_ADDR addr, base;
106  int i;
107 
108  base = get_frame_register_unsigned (this_frame,
110  if (self == &ppcnbsd2_sigtramp)
111  addr = base + 0x10 + 2 * tdep->wordsize;
112  else
113  addr = base + 0x18 + 2 * tdep->wordsize;
114  for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize)
115  {
116  int regnum = i + tdep->ppc_gp0_regnum;
117  trad_frame_set_reg_addr (this_cache, regnum, addr);
118  }
119  trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, addr);
120  addr += tdep->wordsize;
121  trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, addr);
122  addr += tdep->wordsize;
123  trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, addr);
124  addr += tdep->wordsize;
125  trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, addr);
126  addr += tdep->wordsize;
128  addr); /* SRR0? */
129  addr += tdep->wordsize;
130 
131  /* Construct the frame ID using the function start. */
132  trad_frame_set_id (this_cache, frame_id_build (base, func));
133 }
134 
135 static const struct tramp_frame ppcnbsd_sigtramp =
136 {
138  4,
139  {
140  { 0x3821fff0, -1 }, /* add r1,r1,-16 */
141  { 0x4e800021, -1 }, /* blrl */
142  { 0x38610018, -1 }, /* addi r3,r1,24 */
143  { 0x38000127, -1 }, /* li r0,295 */
144  { 0x44000002, -1 }, /* sc */
145  { 0x38000001, -1 }, /* li r0,1 */
146  { 0x44000002, -1 }, /* sc */
147  { TRAMP_SENTINEL_INSN, -1 }
148  },
150 };
151 
152 /* NetBSD 2.0 introduced a slightly different signal trampoline. */
153 
155 {
157  4,
158  {
159  { 0x3821fff0, -1 }, /* add r1,r1,-16 */
160  { 0x4e800021, -1 }, /* blrl */
161  { 0x38610010, -1 }, /* addi r3,r1,16 */
162  { 0x38000127, -1 }, /* li r0,295 */
163  { 0x44000002, -1 }, /* sc */
164  { 0x38000001, -1 }, /* li r0,1 */
165  { 0x44000002, -1 }, /* sc */
166  { TRAMP_SENTINEL_INSN, -1 }
167  },
169 };
170 
171 
172 static void
174  struct gdbarch *gdbarch)
175 {
176  /* For NetBSD, this is an on again, off again thing. Some systems
177  do use the broken struct convention, and some don't. */
179 
180  /* NetBSD uses SVR4-style shared libraries. */
183 
186 
189 }
190 
191 void
193 {
194  gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_NETBSD,
196 
197  /* Avoid initializing the register offsets again if they were
198  already initialized by ppcnbsd-nat.c. */
200  {
201  /* General-purpose registers. */
212 
213  /* Floating-point registers. */
217 
218  /* AltiVec registers. */
222  }
223 }
void trad_frame_set_reg_addr(struct trad_frame_cache *this_trad_cache, int regnum, CORE_ADDR addr)
Definition: trad-frame.c:126
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:624
enum return_value_convention ppc_sysv_abi_broken_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
bfd_vma CORE_ADDR
Definition: common-types.h:41
#define TRAMP_SENTINEL_INSN
Definition: tramp-frame.h:44
static void ppcnbsd_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
Definition: ppc-nbsd-tdep.c:57
int ppc_lr_regnum
Definition: ppc-tdep.h:231
void(* func)(char *)
void() iterate_over_regset_sections_cb(const char *sect_name, int size, const struct regset *regset, const char *human_name, void *cb_data)
Definition: gdbarch.h:99
void ppc_supply_fpregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *fpregs, size_t len)
Definition: rs6000-tdep.c:561
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
Definition: trad-frame.c:171
return_value_convention
Definition: defs.h:247
struct link_map_offsets * svr4_ilp32_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3183
int ppc_cr_regnum
Definition: ppc-tdep.h:230
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1491
const struct tramp_frame ppcnbsd2_sigtramp
const struct regset ppcnbsd_fpregset
Definition: ppc-nbsd-tdep.c:48
Definition: regset.h:34
const struct regset ppcnbsd_gregset
Definition: ppc-nbsd-tdep.c:42
int gdbarch_sp_regnum(struct gdbarch *gdbarch)
Definition: gdbarch.c:2146
int ppc_gp0_regnum
Definition: ppc-tdep.h:227
#define TYPE_VECTOR(t)
Definition: gdbtypes.h:252
static void ppcnbsd_sigtramp_cache_init(const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
Definition: ppc-nbsd-tdep.c:98
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3137
Definition: gdbtypes.h:749
static enum return_value_convention ppcnbsd_return_value(struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
Definition: ppc-nbsd-tdep.c:72
struct ppc_reg_offsets ppcnbsd_reg_offsets
Definition: ppc-nbsd-tdep.c:35
int regnum
Definition: aarch64-tdep.c:77
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1308
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
Definition: osabi.c:143
Definition: value.c:169
bfd_byte gdb_byte
Definition: common-types.h:38
int ppc_ctr_regnum
Definition: ppc-tdep.h:232
static const struct tramp_frame ppcnbsd_sigtramp
static void ppcnbsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
#define TYPE_CODE(thistype)
Definition: gdbtypes.h:1238
int wordsize
Definition: ppc-tdep.h:216
void tramp_frame_prepend_unwinder(struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame)
Definition: tramp-frame.c:146
int ppc_xer_regnum
Definition: ppc-tdep.h:233
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
Definition: gdbarch.c:2738
int gdbarch_pc_regnum(struct gdbarch *gdbarch)
Definition: gdbarch.c:2163
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1235
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
Definition: gdbarch.c:3647
void _initialize_ppcnbsd_tdep(void)
void ppc_supply_gregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len)
Definition: rs6000-tdep.c:511
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2691