GDB (xrefs)
/tmp/gdb-7.10/gdb/ppcnbsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for NetBSD/powerpc.
2 
3  Copyright (C) 2002-2015 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 "ppcnbsd-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,
109  gdbarch_sp_regnum (gdbarch));
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;
127  trad_frame_set_reg_addr (this_cache, gdbarch_pc_regnum (gdbarch),
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 
154 const struct tramp_frame ppcnbsd2_sigtramp =
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 
187  tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd_sigtramp);
188  tramp_frame_prepend_unwinder (gdbarch, &ppcnbsd2_sigtramp);
189 }
190 
191 
192 /* Provide a prototype to silence -Wmissing-prototypes. */
193 void _initialize_ppcnbsd_tdep (void);
194 
195 void
197 {
198  gdbarch_register_osabi (bfd_arch_powerpc, 0, GDB_OSABI_NETBSD_ELF,
200 
201  /* Avoid initializing the register offsets again if they were
202  already initailized by ppcnbsd-nat.c. */
204  {
205  /* General-purpose registers. */
216 
217  /* Floating-point registers. */
221 
222  /* AltiVec registers. */
226  }
227 }
void trad_frame_set_reg_addr(struct trad_frame_cache *this_trad_cache, int regnum, CORE_ADDR addr)
Definition: trad-frame.c:119
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:554
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
struct ppc_reg_offsets ppcnbsd_reg_offsets
Definition: ppcnbsd-tdep.c:35
int ppc_lr_regnum
Definition: ppc-tdep.h:218
void(* func)(char *)
void ppc_supply_fpregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *fpregs, size_t len)
Definition: rs6000-tdep.c:550
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
Definition: trad-frame.c:164
return_value_convention
Definition: defs.h:206
struct link_map_offsets * svr4_ilp32_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3149
int ppc_cr_regnum
Definition: ppc-tdep.h:217
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
Definition: gdbarch.c:1402
static void ppcnbsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: ppcnbsd-tdep.c:173
Definition: regset.h:34
int gdbarch_sp_regnum(struct gdbarch *gdbarch)
Definition: gdbarch.c:1981
static void ppcnbsd_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
Definition: ppcnbsd-tdep.c:57
int ppc_gp0_regnum
Definition: ppc-tdep.h:214
#define TYPE_VECTOR(t)
Definition: gdbtypes.h:287
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3108
Definition: gdbtypes.h:749
int regnum
Definition: aarch64-tdep.c:69
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:98
ULONGEST get_frame_register_unsigned(struct frame_info *frame, int regnum)
Definition: frame.c:1194
Definition: value.c:172
bfd_byte gdb_byte
Definition: common-types.h:38
int ppc_ctr_regnum
Definition: ppc-tdep.h:219
#define TYPE_CODE(thistype)
Definition: gdbtypes.h:1240
int wordsize
Definition: ppc-tdep.h:206
void tramp_frame_prepend_unwinder(struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame)
Definition: tramp-frame.c:145
int ppc_xer_regnum
Definition: ppc-tdep.h:220
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: ppcnbsd-tdep.c:72
void _initialize_ppcnbsd_tdep(void)
Definition: ppcnbsd-tdep.c:196
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
Definition: gdbarch.c:2556
int gdbarch_pc_regnum(struct gdbarch *gdbarch)
Definition: gdbarch.c:1998
#define TYPE_LENGTH(thistype)
Definition: gdbtypes.h:1237
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
Definition: gdbarch.c:3398
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: ppcnbsd-tdep.c:98
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:148
void ppc_supply_gregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len)
Definition: rs6000-tdep.c:505
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2535