41#include "gdbsupport/gdb_signals.h"
92#define MIPS_LINUX_JB_ELEMENT_SIZE 4
93#define MIPS_LINUX_JB_PC 0
161 int regnum,
const void *gregs,
size_t len)
182 for (regi = 1; regi < 32; regi++)
194 if (regno > 0 && regno < 32)
221 dst = regp + regaddr;
229 int regnum,
void *gregs,
size_t len)
246#define MIPS64_LINUX_JB_PC 0
302 (
const gdb_byte *) (regp + regi));
329 int regnum,
const void *gregs,
size_t len)
350 for (regi = 1; regi < 32; regi++)
363 if (regno > 0 && regno < 32)
385 dst = regp + regaddr;
393 int regnum,
void *gregs,
size_t len)
419 for (regi = 0; regi < 32; regi++)
421 const gdb_byte *reg_ptr
422 = (
const gdb_byte *) (*fpregsetp + (regi & ~1));
428 for (regi = 0; regi < 32; regi++)
430 (
const char *) (*fpregsetp + regi));
433 (
const gdb_byte *) (*fpregsetp + 32));
440 (
const gdb_byte *) (*fpregsetp + 32) + 4);
446 int regnum,
const void *gregs,
size_t len)
471 to = (gdb_byte *) (*fpregsetp + (regi & ~1));
478 to = (gdb_byte *) (*fpregsetp + regno
485 to = (gdb_byte *) (*fpregsetp + 32);
490 to = (gdb_byte *) (*fpregsetp + 32) + 4;
493 else if (regno == -1)
497 for (regi = 0; regi < 32; regi++)
510 int regnum,
void *gregs,
size_t len)
561 asection *section = bfd_get_section_by_name (abfd,
".reg");
565 switch (bfd_section_size (section))
600 gdb_byte buf[28], *p;
601 ULONGEST insn, insn1;
636 if (insn != 0x03e0782d && insn != 0x03e07825)
642 if (insn != 0x03e07821 && insn != 0x03e07825)
648 if (insn != 0x0320f809)
655 if ((insn & 0xffff0000) != 0x64180000)
661 if ((insn & 0xffff0000) != 0x24180000)
733#define MIPS_NR_LINUX 4000
734#define MIPS_NR_N64_LINUX 5000
735#define MIPS_NR_N32_LINUX 6000
737#define MIPS_NR_sigreturn MIPS_NR_LINUX + 119
738#define MIPS_NR_rt_sigreturn MIPS_NR_LINUX + 193
739#define MIPS_NR_N64_rt_sigreturn MIPS_NR_N64_LINUX + 211
740#define MIPS_NR_N32_rt_sigreturn MIPS_NR_N32_LINUX + 211
742#define MIPS_INST_LI_V0_SIGRETURN 0x24020000 + MIPS_NR_sigreturn
743#define MIPS_INST_LI_V0_RT_SIGRETURN 0x24020000 + MIPS_NR_rt_sigreturn
744#define MIPS_INST_LI_V0_N64_RT_SIGRETURN 0x24020000 + MIPS_NR_N64_rt_sigreturn
745#define MIPS_INST_LI_V0_N32_RT_SIGRETURN 0x24020000 + MIPS_NR_N32_rt_sigreturn
746#define MIPS_INST_SYSCALL 0x0000000c
748#define MICROMIPS_INST_LI_V0 0x3040
749#define MICROMIPS_INST_POOL32A 0x0000
750#define MICROMIPS_INST_SYSCALL 0x8b7c
930#define SIGFRAME_SIGCONTEXT_OFFSET (6 * 4)
932#define RTSIGFRAME_SIGINFO_SIZE 128
933#define STACK_T_SIZE (3 * 4)
934#define UCONTEXT_SIGCONTEXT_OFFSET (2 * 4 + STACK_T_SIZE + 4)
935#define RTSIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
936 + RTSIGFRAME_SIGINFO_SIZE \
937 + UCONTEXT_SIGCONTEXT_OFFSET)
939#define SIGCONTEXT_PC (1 * 8)
940#define SIGCONTEXT_REGS (2 * 8)
941#define SIGCONTEXT_FPREGS (34 * 8)
942#define SIGCONTEXT_FPCSR (66 * 8 + 4)
943#define SIGCONTEXT_DSPCTL (68 * 8 + 0)
944#define SIGCONTEXT_HI (69 * 8)
945#define SIGCONTEXT_LO (70 * 8)
946#define SIGCONTEXT_CAUSE (71 * 8 + 0)
947#define SIGCONTEXT_BADVADDR (71 * 8 + 4)
948#define SIGCONTEXT_HI1 (71 * 8 + 0)
949#define SIGCONTEXT_LO1 (71 * 8 + 4)
950#define SIGCONTEXT_HI2 (72 * 8 + 0)
951#define SIGCONTEXT_LO2 (72 * 8 + 4)
952#define SIGCONTEXT_HI3 (73 * 8 + 0)
953#define SIGCONTEXT_LO3 (73 * 8 + 4)
955#define SIGCONTEXT_REG_SIZE 8
966 CORE_ADDR sigcontext_base;
982 regs_base = sigcontext_base + 4;
984 regs_base = sigcontext_base;
992 for (ireg = 1; ireg < 32; ireg++)
999 for (ireg = 0; ireg < 32; ireg++)
1123#define N32_STACK_T_SIZE STACK_T_SIZE
1124#define N64_STACK_T_SIZE (2 * 8 + 4)
1125#define N32_UCONTEXT_SIGCONTEXT_OFFSET (2 * 4 + N32_STACK_T_SIZE + 4)
1126#define N64_UCONTEXT_SIGCONTEXT_OFFSET (2 * 8 + N64_STACK_T_SIZE + 4)
1127#define N32_SIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
1128 + RTSIGFRAME_SIGINFO_SIZE \
1129 + N32_UCONTEXT_SIGCONTEXT_OFFSET)
1130#define N64_SIGFRAME_SIGCONTEXT_OFFSET (SIGFRAME_SIGCONTEXT_OFFSET \
1131 + RTSIGFRAME_SIGINFO_SIZE \
1132 + N64_UCONTEXT_SIGCONTEXT_OFFSET)
1134#define N64_SIGCONTEXT_REGS (0 * 8)
1135#define N64_SIGCONTEXT_FPREGS (32 * 8)
1136#define N64_SIGCONTEXT_HI (64 * 8)
1137#define N64_SIGCONTEXT_HI1 (65 * 8)
1138#define N64_SIGCONTEXT_HI2 (66 * 8)
1139#define N64_SIGCONTEXT_HI3 (67 * 8)
1140#define N64_SIGCONTEXT_LO (68 * 8)
1141#define N64_SIGCONTEXT_LO1 (69 * 8)
1142#define N64_SIGCONTEXT_LO2 (70 * 8)
1143#define N64_SIGCONTEXT_LO3 (71 * 8)
1144#define N64_SIGCONTEXT_PC (72 * 8)
1145#define N64_SIGCONTEXT_FPCSR (73 * 8 + 0)
1146#define N64_SIGCONTEXT_DSPCTL (74 * 8 + 0)
1148#define N64_SIGCONTEXT_REG_SIZE 8
1159 CORE_ADDR sigcontext_base;
1174 for (ireg = 1; ireg < 32; ireg++)
1181 for (ireg = 0; ireg < 32; ireg++)
1329 gdb_assert (regsize <=
sizeof (buf));
1345 enum gdb_signal signal)
1349 case GDB_SIGNAL_EMT:
1352 case GDB_SIGNAL_BUS:
1355 case GDB_SIGNAL_SYS:
1358 case GDB_SIGNAL_USR1:
1361 case GDB_SIGNAL_USR2:
1364 case GDB_SIGNAL_CHLD:
1367 case GDB_SIGNAL_PWR:
1370 case GDB_SIGNAL_WINCH:
1373 case GDB_SIGNAL_URG:
1379 case GDB_SIGNAL_POLL:
1382 case GDB_SIGNAL_STOP:
1385 case GDB_SIGNAL_TSTP:
1388 case GDB_SIGNAL_CONT:
1391 case GDB_SIGNAL_TTIN:
1394 case GDB_SIGNAL_TTOU:
1397 case GDB_SIGNAL_VTALRM:
1400 case GDB_SIGNAL_PROF:
1403 case GDB_SIGNAL_XCPU:
1406 case GDB_SIGNAL_XFSZ:
1411 case GDB_SIGNAL_REALTIME_32:
1415 if (signal >= GDB_SIGNAL_REALTIME_33
1416 && signal <= GDB_SIGNAL_REALTIME_63)
1418 int offset = signal - GDB_SIGNAL_REALTIME_33;
1422 else if (signal >= GDB_SIGNAL_REALTIME_64
1423 && signal <= GDB_SIGNAL_REALTIME_127)
1425 int offset = signal - GDB_SIGNAL_REALTIME_64;
1436static enum gdb_signal
1442 return GDB_SIGNAL_EMT;
1445 return GDB_SIGNAL_BUS;
1448 return GDB_SIGNAL_SYS;
1451 return GDB_SIGNAL_USR1;
1454 return GDB_SIGNAL_USR2;
1457 return GDB_SIGNAL_CHLD;
1460 return GDB_SIGNAL_PWR;
1463 return GDB_SIGNAL_WINCH;
1466 return GDB_SIGNAL_URG;
1471 return GDB_SIGNAL_IO;
1474 return GDB_SIGNAL_STOP;
1477 return GDB_SIGNAL_TSTP;
1480 return GDB_SIGNAL_CONT;
1483 return GDB_SIGNAL_TTIN;
1486 return GDB_SIGNAL_TTOU;
1489 return GDB_SIGNAL_VTALRM;
1492 return GDB_SIGNAL_PROF;
1495 return GDB_SIGNAL_XCPU;
1498 return GDB_SIGNAL_XFSZ;
1508 return GDB_SIGNAL_REALTIME_32;
1509 else if (offset < 32)
1510 return (
enum gdb_signal) (offset - 1
1511 + (int) GDB_SIGNAL_REALTIME_33);
1513 return (
enum gdb_signal) (offset - 32
1514 + (int) GDB_SIGNAL_REALTIME_64);
1613 const struct tdesc_feature *feature;
1624 "org.gnu.gdb.mips.linux");
1625 if (feature != NULL)
1635 const struct bfd_arch_info *arch_info;
1637 for (arch_info = bfd_lookup_arch (bfd_arch_mips, 0);
1639 arch_info = arch_info->next)
struct gdbarch * target_gdbarch(void)
enum register_status cooked_read(int regnum, gdb_byte *buf)
void raw_collect_integer(int regnum, gdb_byte *addr, int addr_len, bool is_signed) const
void raw_supply_integer(int regnum, const gdb_byte *addr, int addr_len, bool is_signed)
void raw_collect(int regnum, void *buf) const override
void raw_supply(int regnum, const void *buf) override
void raw_supply_zeroed(int regnum)
void read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
static LONGEST extract_signed_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
static ULONGEST extract_unsigned_integer(gdb::array_view< const gdb_byte > buf, enum bfd_endian byte_order)
ULONGEST get_frame_register_unsigned(frame_info_ptr frame, int regnum)
CORE_ADDR frame_unwind_caller_pc(frame_info_ptr this_frame)
CORE_ADDR get_frame_pc(frame_info_ptr frame)
CORE_ADDR get_frame_sp(frame_info_ptr this_frame)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
struct gdbarch * get_frame_arch(frame_info_ptr this_frame)
frame_info_ptr get_current_frame(void)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void set_gdbarch_software_single_step(struct gdbarch *gdbarch, gdbarch_software_single_step_ftype *software_single_step)
void set_gdbarch_core_read_description(struct gdbarch *gdbarch, gdbarch_core_read_description_ftype *core_read_description)
void set_gdbarch_write_pc(struct gdbarch *gdbarch, gdbarch_write_pc_ftype *write_pc)
void set_gdbarch_get_longjmp_target(struct gdbarch *gdbarch, gdbarch_get_longjmp_target_ftype *get_longjmp_target)
void set_gdbarch_get_syscall_number(struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype *get_syscall_number)
int gdbarch_num_regs(struct gdbarch *gdbarch)
void set_gdbarch_long_double_format(struct gdbarch *gdbarch, const struct floatformat **long_double_format)
void set_gdbarch_gdb_signal_from_target(struct gdbarch *gdbarch, gdbarch_gdb_signal_from_target_ftype *gdb_signal_from_target)
const struct target_desc * gdbarch_target_desc(struct gdbarch *gdbarch)
void set_gdbarch_num_pseudo_regs(struct gdbarch *gdbarch, int num_pseudo_regs)
void set_gdbarch_gdb_signal_to_target(struct gdbarch *gdbarch, gdbarch_gdb_signal_to_target_ftype *gdb_signal_to_target)
void set_gdbarch_fetch_tls_load_module_address(struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype *fetch_tls_load_module_address)
int gdbarch_fp0_regnum(struct gdbarch *gdbarch)
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
void set_gdbarch_long_double_bit(struct gdbarch *gdbarch, int long_double_bit)
int gdbarch_ptr_bit(struct gdbarch *gdbarch)
void set_gdbarch_so_ops(struct gdbarch *gdbarch, const struct target_so_ops *so_ops)
void set_gdbarch_skip_solib_resolver(struct gdbarch *gdbarch, gdbarch_skip_solib_resolver_ftype *skip_solib_resolver)
void set_gdbarch_iterate_over_regset_sections(struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype *iterate_over_regset_sections)
void iterate_over_regset_sections_cb(const char *sect_name, int supply_size, int collect_size, const struct regset *regset, const char *human_name, void *cb_data)
const struct floatformat * floatformats_ieee_quad[BFD_ENDIAN_UNKNOWN]
CORE_ADDR glibc_skip_solib_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
link_map_offsets * linux_lp64_fetch_link_map_offsets()
int linux_gdb_signal_to_target(struct gdbarch *gdbarch, enum gdb_signal signal)
enum gdb_signal linux_gdb_signal_from_target(struct gdbarch *gdbarch, int signal)
link_map_offsets * linux_ilp32_fetch_link_map_offsets()
void linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch, int num_disp_step_buffers)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
static void initialize_tdesc_mips_dsp_linux(void)
void mips_fill_gregset(const struct regcache *regcache, mips_elf_gregset_t *gregsetp, int regno)
#define MIPS64_LINUX_JB_PC
static const struct tramp_frame micromips_linux_o32_rt_sigframe
#define MIPS_NR_sigreturn
static void mips64_supply_gregset_wrapper(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len)
static const struct tramp_frame mips_linux_o32_rt_sigframe
#define MIPS_NR_rt_sigreturn
#define MICROMIPS_INST_SYSCALL
static void mips64_fill_gregset_wrapper(const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len)
static CORE_ADDR mips_linux_skip_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
static void supply_64bit_reg(struct regcache *regcache, int regnum, const gdb_byte *buf)
static const struct tramp_frame mips_linux_o32_sigframe
#define N32_SIGFRAME_SIGCONTEXT_OFFSET
static void mips_fill_gregset_wrapper(const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len)
#define MIPS_INST_LI_V0_N32_RT_SIGRETURN
static int mips_linux_in_dynsym_stub(CORE_ADDR pc)
#define N64_SIGCONTEXT_LO
#define MIPS_INST_LI_V0_RT_SIGRETURN
#define SIGCONTEXT_BADVADDR
static enum gdb_signal mips_gdb_signal_from_target(struct gdbarch *gdbarch, int signal)
#define MIPS_LINUX_JB_ELEMENT_SIZE
static struct target_so_ops mips_svr4_so_ops
void mips_supply_gregset(struct regcache *regcache, const mips_elf_gregset_t *gregsetp)
static const struct tramp_frame micromips_linux_o32_sigframe
#define N64_SIGCONTEXT_FPCSR
static int mips_linux_in_dynsym_resolve_code(CORE_ADDR pc)
int mips_linux_restart_reg_p(struct gdbarch *gdbarch)
#define N64_SIGCONTEXT_HI
void mips64_fill_gregset(const struct regcache *regcache, mips64_elf_gregset_t *gregsetp, int regno)
#define N64_SIGCONTEXT_LO2
static void mips_supply_gregset_wrapper(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len)
static const struct tramp_frame micromips_linux_n64_rt_sigframe
static void mips_linux_n32n64_sigframe_init(const struct tramp_frame *self, frame_info_ptr this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
#define N64_SIGCONTEXT_REG_SIZE
static int mips_gdb_signal_to_target(struct gdbarch *gdbarch, enum gdb_signal signal)
#define MIPS_INST_LI_V0_SIGRETURN
#define N64_SIGCONTEXT_LO1
static CORE_ADDR mips_linux_syscall_next_pc(frame_info_ptr frame)
#define N64_SIGCONTEXT_LO3
static void mips_linux_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
#define N64_SIGFRAME_SIGCONTEXT_OFFSET
#define MICROMIPS_INST_LI_V0
static int micromips_linux_sigframe_validate(const struct tramp_frame *self, frame_info_ptr this_frame, CORE_ADDR *pc)
#define N64_SIGCONTEXT_REGS
#define N64_SIGCONTEXT_FPREGS
static void mips64_fill_fpregset_wrapper(const struct regset *regset, const struct regcache *regcache, int regnum, void *gregs, size_t len)
#define SIGCONTEXT_REG_SIZE
#define RTSIGFRAME_SIGCONTEXT_OFFSET
static void supply_32bit_reg(struct regcache *regcache, int regnum, const void *addr)
#define N64_SIGCONTEXT_HI3
#define MIPS_NR_N64_rt_sigreturn
static const struct tramp_frame mips_linux_n32_rt_sigframe
void mips64_fill_fpregset(const struct regcache *regcache, mips64_elf_fpregset_t *fpregsetp, int regno)
#define N64_SIGCONTEXT_DSPCTL
#define MIPS_INST_LI_V0_N64_RT_SIGRETURN
static void mips_linux_write_pc(struct regcache *regcache, CORE_ADDR pc)
static const struct tramp_frame mips_linux_n64_rt_sigframe
#define SIGCONTEXT_DSPCTL
void mips64_supply_fpregset(struct regcache *regcache, const mips64_elf_fpregset_t *fpregsetp)
static void mips_linux_o32_sigframe_init(const struct tramp_frame *self, frame_info_ptr this_frame, struct trad_frame_cache *this_cache, CORE_ADDR func)
void _initialize_mips_linux_tdep()
static void mips_linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
#define MICROMIPS_INST_POOL32A
static const struct regset mips64_linux_gregset
static int mips64_linux_get_longjmp_target(frame_info_ptr frame, CORE_ADDR *pc)
static const struct regset mips_linux_gregset
#define SIGFRAME_SIGCONTEXT_OFFSET
#define MIPS_INST_SYSCALL
void mips64_supply_gregset(struct regcache *regcache, const mips64_elf_gregset_t *gregsetp)
#define MIPS_NR_N32_rt_sigreturn
#define N64_SIGCONTEXT_HI1
static int mips_linux_sigframe_validate(const struct tramp_frame *self, frame_info_ptr this_frame, CORE_ADDR *pc)
static LONGEST mips_linux_get_syscall_number(struct gdbarch *gdbarch, thread_info *thread)
static const struct target_desc * mips_linux_core_read_description(struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd)
static const struct regset mips64_linux_fpregset
static void mips64_supply_fpregset_wrapper(const struct regset *regset, struct regcache *regcache, int regnum, const void *gregs, size_t len)
#define N64_SIGCONTEXT_PC
#define N64_SIGCONTEXT_HI2
#define SIGCONTEXT_FPREGS
static int mips_linux_get_longjmp_target(frame_info_ptr frame, CORE_ADDR *pc)
static const struct tramp_frame micromips_linux_n32_rt_sigframe
mips64_elf_greg_t mips64_elf_gregset_t[MIPS64_ELF_NGREG]
#define MIPS64_EF_CP0_BADVADDR
unsigned char mips_elf_greg_t[4]
#define MIPS64_EF_CP0_EPC
mips_elf_greg_t mips_elf_gregset_t[ELF_NGREG]
#define MIPS64_EF_CP0_STATUS
#define MIPS64_EF_CP0_CAUSE
unsigned char mips64_elf_greg_t[8]
mips64_elf_fpreg_t mips64_elf_fpregset_t[MIPS64_ELF_NFPREG]
static void initialize_tdesc_mips_linux(void)
int mips_pc_is_mips(CORE_ADDR memaddr)
struct target_desc * mips_tdesc_gp64
void mips_write_pc(struct regcache *regcache, CORE_ADDR pc)
struct target_desc * mips_tdesc_gp32
std::vector< CORE_ADDR > mips_software_single_step(struct regcache *regcache)
const struct mips_regnum * mips_regnum(struct gdbarch *gdbarch)
int mips_pc_is_micromips(struct gdbarch *gdbarch, CORE_ADDR memaddr)
CORE_ADDR mips_unmake_compact_addr(CORE_ADDR addr)
static int in_mips_stubs_section(CORE_ADDR pc)
static void initialize_tdesc_mips64_dsp_linux(void)
static void initialize_tdesc_mips64_linux(void)
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
int register_size(struct gdbarch *gdbarch, int regnum)
struct regcache * get_thread_regcache(process_stratum_target *target, ptid_t ptid)
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
void(* func)(remote_target *remote, char *)
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
const struct target_so_ops svr4_so_ops
int svr4_in_dynsym_resolve_code(CORE_ADDR pc)
CORE_ADDR svr4_fetch_objfile_link_map(struct objfile *objfile)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
CORE_ADDR(* syscall_next_pc)(frame_info_ptr frame)
int fp_implementation_revision
int(* in_dynsym_resolve_code)(CORE_ADDR pc)
const struct tdesc_feature * tdesc_find_feature(const struct target_desc *target_desc, const char *name)
int tdesc_numbered_register(const struct tdesc_feature *feature, struct tdesc_arch_data *data, int regno, const char *name)
static const registry< gdbarch >::key< tdesc_arch_data > tdesc_data
int tdesc_has_registers(const struct target_desc *target_desc)
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
void trad_frame_set_reg_addr(struct trad_frame_cache *this_trad_cache, int regnum, CORE_ADDR addr)
void trad_frame_set_id(struct trad_frame_cache *this_trad_cache, struct frame_id this_id)
void tramp_frame_prepend_unwinder(struct gdbarch *gdbarch, const struct tramp_frame *tramp_frame)
#define TRAMP_SENTINEL_INSN
void set_xml_syscall_file_name(struct gdbarch *gdbarch, const char *name)