gdb/sh-linux-tdep.c - gdb
Global variables defined
Functions defined
Macros defined
Source code
- #include "defs.h"
- #include "osabi.h"
- #include "solib-svr4.h"
- #include "symtab.h"
- #include "trad-frame.h"
- #include "tramp-frame.h"
- #include "glibc-tdep.h"
- #include "sh-tdep.h"
- #include "linux-tdep.h"
- #define REGSx16(base) \
- {(base), 0}, \
- {(base) + 1, 4}, \
- {(base) + 2, 8}, \
- {(base) + 3, 12}, \
- {(base) + 4, 16}, \
- {(base) + 5, 20}, \
- {(base) + 6, 24}, \
- {(base) + 7, 28}, \
- {(base) + 8, 32}, \
- {(base) + 9, 36}, \
- {(base) + 10, 40}, \
- {(base) + 11, 44}, \
- {(base) + 12, 48}, \
- {(base) + 13, 52}, \
- {(base) + 14, 56}, \
- {(base) + 15, 60}
- static const struct sh_corefile_regmap gregs_table[] =
- {
- REGSx16 (R0_REGNUM),
- {PC_REGNUM, 64},
- {PR_REGNUM, 68},
- {SR_REGNUM, 72},
- {GBR_REGNUM, 76},
- {MACH_REGNUM, 80},
- {MACL_REGNUM, 84},
- {-1 , 0}
- };
- static const struct sh_corefile_regmap fpregs_table[] =
- {
- REGSx16 (FR0_REGNUM),
-
- {FPSCR_REGNUM, 128},
- {FPUL_REGNUM, 132},
- {-1 , 0}
- };
- static void
- sh_linux_sigtramp_cache (struct frame_info *this_frame,
- struct trad_frame_cache *this_cache,
- CORE_ADDR func, int regs_offset)
- {
- int i;
- struct gdbarch *gdbarch = get_frame_arch (this_frame);
- CORE_ADDR base = get_frame_register_unsigned (this_frame,
- gdbarch_sp_regnum (gdbarch));
- CORE_ADDR regs = base + regs_offset;
- for (i = 0; i < 18; i++)
- trad_frame_set_reg_addr (this_cache, i, regs + i * 4);
- trad_frame_set_reg_addr (this_cache, SR_REGNUM, regs + 18 * 4);
- trad_frame_set_reg_addr (this_cache, GBR_REGNUM, regs + 19 * 4);
- trad_frame_set_reg_addr (this_cache, MACH_REGNUM, regs + 20 * 4);
- trad_frame_set_reg_addr (this_cache, MACL_REGNUM, regs + 21 * 4);
-
- if (gdbarch_fp0_regnum (gdbarch) != -1)
- {
- CORE_ADDR fpregs = regs + 22 * 4;
- for (i = FR0_REGNUM; i <= FP_LAST_REGNUM; i++)
- trad_frame_set_reg_addr (this_cache, i, fpregs + i * 4);
- trad_frame_set_reg_addr (this_cache, FPSCR_REGNUM, fpregs + 32 * 4);
- trad_frame_set_reg_addr (this_cache, FPUL_REGNUM, fpregs + 33 * 4);
- }
-
- trad_frame_set_id (this_cache, frame_id_build (base, func));
- }
- static void
- sh_linux_sigreturn_init (const struct tramp_frame *self,
- struct frame_info *this_frame,
- struct trad_frame_cache *this_cache,
- CORE_ADDR func)
- {
-
- sh_linux_sigtramp_cache (this_frame, this_cache, func, 4);
- }
- static void
- sh_linux_rt_sigreturn_init (const struct tramp_frame *self,
- struct frame_info *this_frame,
- struct trad_frame_cache *this_cache,
- CORE_ADDR func)
- {
-
- sh_linux_sigtramp_cache (this_frame, this_cache, func,
- 128
- + 20
- + 4 );
- }
- #define SH_MOVW 0x9305
- #define SH_TRAP 0xc300
- #define SH_OR_R0_R0 0x200b
- #define SH_NR_SIGRETURN 0x0077
- #define SH_NR_RT_SIGRETURN 0x00ad
- static struct tramp_frame sh_linux_sigreturn_tramp_frame = {
- SIGTRAMP_FRAME,
- 2,
- {
- { SH_MOVW, 0xffff },
- { SH_TRAP, 0xff00 },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_NR_SIGRETURN, 0xffff },
- { TRAMP_SENTINEL_INSN }
- },
- sh_linux_sigreturn_init
- };
- static struct tramp_frame sh_linux_rt_sigreturn_tramp_frame = {
- SIGTRAMP_FRAME,
- 2,
- {
- { SH_MOVW, 0xffff },
- { SH_TRAP, 0xff00 },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_OR_R0_R0, 0xffff },
- { SH_NR_RT_SIGRETURN, 0xffff },
- { TRAMP_SENTINEL_INSN }
- },
- sh_linux_rt_sigreturn_init
- };
- static void
- sh_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
- {
- linux_init_abi (info, gdbarch);
-
- set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
- set_solib_svr4_fetch_link_map_offsets
- (gdbarch, svr4_ilp32_fetch_link_map_offsets);
- set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver);
- set_gdbarch_fetch_tls_load_module_address (gdbarch,
- svr4_fetch_objfile_link_map);
-
- if (info.bfd_arch_info->mach != bfd_mach_sh5)
- {
- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
-
- tdep->core_gregmap = (struct sh_corefile_regmap *)gregs_table;
- tdep->sizeof_gregset = 92;
- tdep->core_fpregmap = (struct sh_corefile_regmap *)fpregs_table;
- tdep->sizeof_fpregset = 136;
- tramp_frame_prepend_unwinder (gdbarch, &sh_linux_sigreturn_tramp_frame);
- tramp_frame_prepend_unwinder (gdbarch, &sh_linux_rt_sigreturn_tramp_frame);
- }
- }
- extern void _initialize_sh_linux_tdep (void);
- void
- _initialize_sh_linux_tdep (void)
- {
- gdbarch_register_osabi (bfd_arch_sh, 0, GDB_OSABI_LINUX, sh_linux_init_abi);
- }