GDB (xrefs)
/tmp/gdb-7.10/gdb/mips64obsd-tdep.c
Go to the documentation of this file.
1 /* Target-dependent code for OpenBSD/mips64.
2 
3  Copyright (C) 2004-2015 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 "gdbtypes.h"
22 #include "osabi.h"
23 #include "regcache.h"
24 #include "regset.h"
25 #include "trad-frame.h"
26 #include "tramp-frame.h"
27 
28 #include "obsd-tdep.h"
29 #include "mips-tdep.h"
30 #include "solib-svr4.h"
31 
32 /* The MIPS64 Floating-Point Quad-Precision format is similar to
33  big-endian IA-64 Quad-Precision format. */
34 #define floatformats_mips64_quad floatformats_ia64_quad
35 
36 #define MIPS64OBSD_NUM_REGS 73
37 
38 /* Core file support. */
39 
40 /* Supply register REGNUM from the buffer specified by GREGS and LEN
41  in the general-purpose register set REGSET to register cache
42  REGCACHE. If REGNUM is -1, do this for all registers in REGSET. */
43 
44 static void
46  struct regcache *regcache, int regnum,
47  const void *gregs, size_t len)
48 {
49  const char *regs = gregs;
50  int i;
51 
52  for (i = 0; i < MIPS64OBSD_NUM_REGS; i++)
53  {
54  if (regnum == i || regnum == -1)
55  regcache_raw_supply (regcache, i, regs + i * 8);
56  }
57 }
58 
59 /* OpenBSD/mips64 register set. */
60 
61 static const struct regset mips64obsd_gregset =
62 {
63  NULL,
65 };
66 
67 /* Iterate over core file register note sections. */
68 
69 static void
72  void *cb_data,
73  const struct regcache *regcache)
74 {
75  cb (".reg", MIPS64OBSD_NUM_REGS * 8, &mips64obsd_gregset, NULL, cb_data);
76 }
77 
78 
79 /* Signal trampolines. */
80 
81 static void
83  struct frame_info *this_frame,
84  struct trad_frame_cache *cache,
86 {
87  struct gdbarch *gdbarch = get_frame_arch (this_frame);
88  CORE_ADDR sp, sigcontext_addr, addr;
89  int regnum;
90 
91  /* We find the appropriate instance of `struct sigcontext' at a
92  fixed offset in the signal frame. */
93  sp = get_frame_register_signed (this_frame,
94  MIPS_SP_REGNUM + gdbarch_num_regs (gdbarch));
95  sigcontext_addr = sp + 32;
96 
97  /* PC. */
98  regnum = mips_regnum (gdbarch)->pc;
100  regnum + gdbarch_num_regs (gdbarch),
101  sigcontext_addr + 16);
102 
103  /* GPRs. */
104  for (regnum = MIPS_AT_REGNUM, addr = sigcontext_addr + 32;
105  regnum <= MIPS_RA_REGNUM; regnum++, addr += 8)
107  regnum + gdbarch_num_regs (gdbarch),
108  addr);
109 
110  /* HI and LO. */
111  regnum = mips_regnum (gdbarch)->lo;
113  regnum + gdbarch_num_regs (gdbarch),
114  sigcontext_addr + 280);
115  regnum = mips_regnum (gdbarch)->hi;
117  regnum + gdbarch_num_regs (gdbarch),
118  sigcontext_addr + 288);
119 
120  /* TODO: Handle the floating-point registers. */
121 
122  trad_frame_set_id (cache, frame_id_build (sp, func));
123 }
124 
125 static const struct tramp_frame mips64obsd_sigframe =
126 {
129  {
130  { 0x67a40020, -1 }, /* daddiu a0,sp,32 */
131  { 0x24020067, -1 }, /* li v0,103 */
132  { 0x0000000c, -1 }, /* syscall */
133  { 0x0000000d, -1 }, /* break */
134  { TRAMP_SENTINEL_INSN, -1 }
135  },
137 };
138 
139 
140 static void
142 {
143  /* OpenBSD/mips64 only supports the n64 ABI, but the braindamaged
144  way GDB works, forces us to pretend we can handle them all. */
145 
148 
149  tramp_frame_prepend_unwinder (gdbarch, &mips64obsd_sigframe);
150 
151  set_gdbarch_long_double_bit (gdbarch, 128);
153 
154  obsd_init_abi(info, gdbarch);
155 
156  /* OpenBSD/mips64 has SVR4-style shared libraries. */
159 }
160 
161 
162 /* Provide a prototype to silence -Wmissing-prototypes. */
163 void _initialize_mips64obsd_tdep (void);
164 
165 void
167 {
170 }
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
bfd_vma CORE_ADDR
Definition: common-types.h:41
#define TRAMP_SENTINEL_INSN
Definition: tramp-frame.h:44
struct link_map_offsets * svr4_lp64_fetch_link_map_offsets(void)
Definition: solib-svr4.c:3180
static void mips64obsd_supply_gregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len)
void(* func)(char *)
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
Definition: trad-frame.c:164
int gdbarch_num_regs(struct gdbarch *gdbarch)
Definition: gdbarch.c:1898
const struct mips_regnum * mips_regnum(struct gdbarch *gdbarch)
Definition: mips-tdep.c:199
void obsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
Definition: obsd-tdep.c:319
Definition: regset.h:34
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
Definition: solib-svr4.c:3108
LONGEST get_frame_register_signed(struct frame_info *frame, int regnum)
Definition: frame.c:1176
static void mips64obsd_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
#define MIPS64OBSD_NUM_REGS
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
void _initialize_mips64obsd_tdep(void)
static void mips64obsd_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
void tramp_frame_prepend_unwinder(struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame)
Definition: tramp-frame.c:145
void regcache_raw_supply(struct regcache *regcache, int regnum, const void *buf)
Definition: regcache.c:1041
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
Definition: gdbarch.c:1667
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
Definition: gdbarch.c:1683
static void mips64obsd_sigframe_init(const struct tramp_frame *self, struct frame_info *this_frame, struct trad_frame_cache *cache, CORE_ADDR func)
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype iterate_over_regset_sections)
Definition: gdbarch.c:3398
#define floatformats_mips64_quad
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
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
Definition: frame.c:2535
const ULONGEST const LONGEST len
Definition: target.h:309