GDB (xrefs)
Loading...
Searching...
No Matches
/tmp/gdb-13.1/gdb/mips-sde-tdep.c
Go to the documentation of this file.
1/* Target-dependent code for SDE on MIPS processors.
2
3 Copyright (C) 2014-2023 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 "osabi.h"
22#include "elf-bfd.h"
23#include "block.h"
24#include "symtab.h"
25
26#include "frame.h"
27#include "frame-unwind.h"
28#include "frame-base.h"
29#include "trad-frame.h"
30
31#include "mips-tdep.h"
32
33/* Fill in the register cache *THIS_CACHE for THIS_FRAME for use
34 in the SDE frame unwinder. */
35
36static struct trad_frame_cache *
38{
39 struct gdbarch *gdbarch = get_frame_arch (this_frame);
40 const struct mips_regnum *regs = mips_regnum (gdbarch);
41 const int sizeof_reg_t = mips_abi_regsize (gdbarch);
42 enum mips_abi abi = mips_abi (gdbarch);
43 struct trad_frame_cache *cache;
44 CORE_ADDR xcpt_frame;
45 CORE_ADDR start_addr;
46 CORE_ADDR stack_addr;
47 CORE_ADDR pc;
48 int i;
49
50 if (*this_cache != NULL)
51 return (struct trad_frame_cache *) *this_cache;
53 *this_cache = cache;
54
55 /* The previous registers are held in struct xcptcontext
56 which is at $sp+offs
57
58 struct xcptcontext {
59 reg_t sr; CP0 Status
60 reg_t cr; CP0 Cause
61 reg_t epc; CP0 EPC
62 reg_t vaddr; CP0 BadVAddr
63 reg_t regs[32]; General registers
64 reg_t mdlo; LO
65 reg_t mdhi; HI
66 reg_t mdex; ACX
67 ...
68 };
69 */
70
73 switch (abi)
74 {
75 case MIPS_ABI_O32:
76 /* 40: XCPTCONTEXT
77 24: xcpt_gen() argspace (16 bytes)
78 16: _xcptcall() saved ra, rounded up ( 8 bytes)
79 00: _xcptcall() argspace (16 bytes) */
80 xcpt_frame = stack_addr + 40;
81 break;
82 case MIPS_ABI_N32:
83 case MIPS_ABI_N64:
84 default: /* Wild guess. */
85 /* 16: XCPTCONTEXT
86 16: xcpt_gen() argspace ( 0 bytes)
87 00: _xcptcall() saved ra, rounded up (16 bytes) */
88 xcpt_frame = stack_addr + 16;
89 break;
90 }
91
94 xcpt_frame + 0 * sizeof_reg_t);
97 xcpt_frame + 1 * sizeof_reg_t);
99 regs->pc + gdbarch_num_regs (gdbarch),
100 xcpt_frame + 2 * sizeof_reg_t);
103 xcpt_frame + 3 * sizeof_reg_t);
104 for (i = 0; i < MIPS_NUMREGS; i++)
107 xcpt_frame + (4 + i) * sizeof_reg_t);
109 regs->lo + gdbarch_num_regs (gdbarch),
110 xcpt_frame + 36 * sizeof_reg_t);
112 regs->hi + gdbarch_num_regs (gdbarch),
113 xcpt_frame + 37 * sizeof_reg_t);
114
116 find_pc_partial_function (pc, NULL, &start_addr, NULL);
117 trad_frame_set_id (cache, frame_id_build (start_addr, stack_addr));
118
119 return cache;
120}
121
122/* Implement the this_id function for the SDE frame unwinder. */
123
124static void
126 struct frame_id *this_id)
127{
128 struct trad_frame_cache *this_trad_cache
129 = mips_sde_frame_cache (this_frame, this_cache);
130
131 trad_frame_get_id (this_trad_cache, this_id);
132}
133
134/* Implement the prev_register function for the SDE frame unwinder. */
135
136static struct value *
138 void **this_cache,
139 int prev_regnum)
140{
141 struct trad_frame_cache *trad_cache
142 = mips_sde_frame_cache (this_frame, this_cache);
143
144 return trad_frame_get_register (trad_cache, this_frame, prev_regnum);
145}
146
147/* Implement the sniffer function for the SDE frame unwinder. */
148
149static int
152 void **this_cache)
153{
154 CORE_ADDR pc = get_frame_pc (this_frame);
155 const char *name;
156
157 find_pc_partial_function (pc, &name, NULL, NULL);
158 return (name
159 && (strcmp (name, "_xcptcall") == 0
160 || strcmp (name, "_sigtramp") == 0));
161}
162
163/* Data structure for the SDE frame unwinder. */
164
166{
167 "mips sde sigtramp",
172 NULL,
174};
175
176/* Implement the this_base, this_locals, and this_args hooks
177 for the normal unwinder. */
178
179static CORE_ADDR
180mips_sde_frame_base_address (frame_info_ptr this_frame, void **this_cache)
181{
182 struct trad_frame_cache *this_trad_cache
183 = mips_sde_frame_cache (this_frame, this_cache);
184
185 return trad_frame_get_this_base (this_trad_cache);
186}
187
188static const struct frame_base mips_sde_frame_base =
189{
194};
195
196static const struct frame_base *
198{
199 if (mips_sde_frame_sniffer (&mips_sde_frame_unwind, this_frame, NULL))
200 return &mips_sde_frame_base;
201 else
202 return NULL;
203}
204
205static void
207 void *obj)
208{
209 enum gdb_osabi *os_ident_ptr = (enum gdb_osabi *) obj;
210 const char *name;
211
212 name = bfd_section_name (sect);
213
214 /* The presence of a section with a ".sde" prefix is indicative
215 of an SDE binary. */
216 if (startswith (name, ".sde"))
217 *os_ident_ptr = GDB_OSABI_SDE;
218}
219
220/* OSABI sniffer for MIPS SDE. */
221
222static enum gdb_osabi
224{
225 enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
226 unsigned int elfosabi;
227
228 /* If the generic sniffer gets a hit, return and let other sniffers
229 get a crack at it. */
230 for (asection *sect : gdb_bfd_sections (abfd))
231 generic_elf_osabi_sniff_abi_tag_sections (abfd, sect, &osabi);
232 if (osabi != GDB_OSABI_UNKNOWN)
233 return GDB_OSABI_UNKNOWN;
234
235 elfosabi = elf_elfheader (abfd)->e_ident[EI_OSABI];
236
237 if (elfosabi == ELFOSABI_NONE)
238 {
239 /* When elfosabi is ELFOSABI_NONE (0), then the ELF structures in the
240 file are conforming to the base specification for that machine
241 (there are no OS-specific extensions). In order to determine the
242 real OS in use we must look for OS notes that have been added.
243
244 For SDE, we simply look for sections named with .sde as prefixes. */
245 bfd_map_over_sections (abfd,
247 &osabi);
248 }
249 return osabi;
250}
251
252static void
254{
257}
258
260void
262{
263 gdbarch_register_osabi_sniffer (bfd_arch_mips,
264 bfd_target_elf_flavour,
266
268}
const char *const name
Definition: aarch64-tdep.c:67
bool find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr, const struct block **block)
Definition: blockframe.c:373
void frame_base_append_sniffer(struct gdbarch *gdbarch, frame_base_sniffer_ftype *sniffer)
Definition: frame-base.c:81
enum unwind_stop_reason default_frame_unwind_stop_reason(frame_info_ptr this_frame, void **this_cache)
Definition: frame-unwind.c:227
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
Definition: frame-unwind.c:107
LONGEST get_frame_register_signed(frame_info_ptr frame, int regnum)
Definition: frame.c:1317
CORE_ADDR get_frame_pc(frame_info_ptr frame)
Definition: frame.c:2592
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
Definition: frame.c:713
struct gdbarch * get_frame_arch(frame_info_ptr this_frame)
Definition: frame.c:2907
@ SIGTRAMP_FRAME
Definition: frame.h:190
static gdb_bfd_section_range gdb_bfd_sections(bfd *abfd)
Definition: gdb_bfd.h:222
int gdbarch_num_regs(struct gdbarch *gdbarch)
Definition: gdbarch.c:1899
int gdbarch_sp_regnum(struct gdbarch *gdbarch)
Definition: gdbarch.c:2006
static const struct frame_unwind mips_sde_frame_unwind
static struct value * mips_sde_frame_prev_register(frame_info_ptr this_frame, void **this_cache, int prev_regnum)
static enum gdb_osabi mips_sde_elf_osabi_sniffer(bfd *abfd)
static CORE_ADDR mips_sde_frame_base_address(frame_info_ptr this_frame, void **this_cache)
static void mips_sde_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
static void mips_sde_frame_this_id(frame_info_ptr this_frame, void **this_cache, struct frame_id *this_id)
static const struct frame_base * mips_sde_frame_base_sniffer(frame_info_ptr this_frame)
static const struct frame_base mips_sde_frame_base
static struct trad_frame_cache * mips_sde_frame_cache(frame_info_ptr this_frame, void **this_cache)
Definition: mips-sde-tdep.c:37
void _initialize_mips_sde_tdep()
static void mips_sde_elf_osabi_sniff_abi_tag_sections(bfd *abfd, asection *sect, void *obj)
static int mips_sde_frame_sniffer(const struct frame_unwind *self, frame_info_ptr this_frame, void **this_cache)
unsigned int mips_abi_regsize(struct gdbarch *gdbarch)
Definition: mips-tdep.c:309
@ MIPS_NUMREGS
Definition: mips-tdep.h:163
mips_abi
Definition: mips-tdep.h:30
@ MIPS_ABI_N32
Definition: mips-tdep.h:32
@ MIPS_ABI_O32
Definition: mips-tdep.h:33
@ MIPS_ABI_N64
Definition: mips-tdep.h:34
@ MIPS_ZERO_REGNUM
Definition: mips-tdep.h:135
@ MIPS_PS_REGNUM
Definition: mips-tdep.h:144
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:146
void generic_elf_osabi_sniff_abi_tag_sections(bfd *abfd, asection *sect, enum gdb_osabi *osabi)
Definition: osabi.c:461
void gdbarch_register_osabi_sniffer(enum bfd_architecture arch, enum bfd_flavour flavour, enum gdb_osabi(*sniffer_fn)(bfd *))
Definition: osabi.c:220
gdb_osabi
Definition: osabi.h:25
@ GDB_OSABI_SDE
Definition: osabi.h:47
@ GDB_OSABI_UNKNOWN
Definition: osabi.h:26
int badvaddr
Definition: mips-tdep.h:76
struct frame_id this_id
Definition: trad-frame.c:35
frame_info_ptr this_frame
Definition: trad-frame.c:32
Definition: value.c:181
struct trad_frame_cache * trad_frame_cache_zalloc(frame_info_ptr this_frame)
Definition: trad-frame.c:39
void trad_frame_set_reg_addr(struct trad_frame_cache *this_trad_cache, int regnum, CORE_ADDR addr)
Definition: trad-frame.c:110
void trad_frame_get_id(struct trad_frame_cache *this_trad_cache, struct frame_id *this_id)
Definition: trad-frame.c:227
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
Definition: trad-frame.c:220
CORE_ADDR trad_frame_get_this_base(struct trad_frame_cache *this_trad_cache)
Definition: trad-frame.c:241
struct value * trad_frame_get_register(struct trad_frame_cache *this_trad_cache, frame_info_ptr this_frame, int regnum)
Definition: trad-frame.c:211