static const struct regset * arm_linux_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if (strcmp (sect_name, ".reg") == 0 && sect_size == ARM_LINUX_SIZEOF_GREGSET) { if (tdep->gregset == NULL) tdep->gregset = regset_alloc (gdbarch, arm_linux_supply_gregset, arm_linux_collect_gregset); return tdep->gregset; } if (strcmp (sect_name, ".reg2") == 0 && sect_size == ARM_LINUX_SIZEOF_NWFPE) { if (tdep->fpregset == NULL) tdep->fpregset = regset_alloc (gdbarch, arm_linux_supply_nwfpe, arm_linux_collect_nwfpe); return tdep->fpregset; } if (strcmp (sect_name, ".reg-arm-vfp") == 0 && sect_size == ARM_LINUX_SIZEOF_VFP) { if (tdep->vfpregset == NULL) tdep->vfpregset = regset_alloc (gdbarch, arm_linux_supply_vfp, arm_linux_collect_vfp); return tdep->vfpregset; } return NULL; }
static const struct regset * aarch64_linux_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if (strcmp (sect_name, ".reg") == 0 && sect_size == AARCH64_LINUX_SIZEOF_GREGSET) { if (tdep->gregset == NULL) tdep->gregset = regset_alloc (gdbarch, supply_gregset_from_core, NULL); return tdep->gregset; } if (strcmp (sect_name, ".reg2") == 0 && sect_size == AARCH64_LINUX_SIZEOF_FPREGSET) { if (tdep->fpregset == NULL) tdep->fpregset = regset_alloc (gdbarch, supply_fpregset_from_core, NULL); return tdep->fpregset; } return NULL; }
const struct regset * mips_linux_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); mips_elf_gregset_t gregset; mips_elf_fpregset_t fpregset; mips64_elf_gregset_t gregset64; mips64_elf_fpregset_t fpregset64; if (strcmp (sect_name, ".reg") == 0) { if (sect_size == sizeof (gregset)) { if (tdep->gregset == NULL) tdep->gregset = regset_alloc (gdbarch, mips_supply_gregset_wrapper, mips_fill_gregset_wrapper); return tdep->gregset; } else if (sect_size == sizeof (gregset64)) { if (tdep->gregset64 == NULL) tdep->gregset64 = regset_alloc (gdbarch, mips64_supply_gregset_wrapper, mips64_fill_gregset_wrapper); return tdep->gregset64; } else { warning (_("wrong size gregset struct in core file")); } } else if (strcmp (sect_name, ".reg2") == 0) { if (sect_size == sizeof (fpregset)) { if (tdep->fpregset == NULL) tdep->fpregset = regset_alloc (gdbarch, mips_supply_fpregset_wrapper, mips_fill_fpregset_wrapper); return tdep->fpregset; } else if (sect_size == sizeof (fpregset64)) { if (tdep->fpregset64 == NULL) tdep->fpregset64 = regset_alloc (gdbarch, mips64_supply_fpregset_wrapper, mips64_fill_fpregset_wrapper); return tdep->fpregset64; } else { warning (_("wrong size fpregset struct in core file")); } } return NULL; }
static void sparc64obsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->gregset = regset_alloc (gdbarch, sparc64obsd_supply_gregset, NULL); tdep->sizeof_gregset = 832; /* Make sure we can single-step "new" syscalls. */ tdep->step_trap = sparcnbsd_step_trap; frame_unwind_append_unwinder (gdbarch, &sparc64obsd_frame_unwind); frame_unwind_append_unwinder (gdbarch, &sparc64obsd_trapframe_unwind); sparc64_init_abi (info, gdbarch); /* OpenBSD/sparc64 has SVR4-style shared libraries. */ set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); set_gdbarch_skip_solib_resolver (gdbarch, obsd_skip_solib_resolver); /* OpenBSD provides a user-level threads implementation. */ bsd_uthread_set_supply_uthread (gdbarch, sparc64obsd_supply_uthread); bsd_uthread_set_collect_uthread (gdbarch, sparc64obsd_collect_uthread); }
static const struct regset * am33_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { /* We will call regset_alloc, and pass the names of the supply and collect methods. */ if (sect_size == sizeof (mn10300_elf_fpregset_t)) return regset_alloc (gdbarch, am33_supply_fpregset_method, am33_collect_fpregset_method); else return regset_alloc (gdbarch, am33_supply_gregset_method, am33_collect_gregset_method); }
static void sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* NetBSD doesn't support the 128-bit `long double' from the psABI. */ set_gdbarch_long_double_bit (gdbarch, 64); set_gdbarch_long_double_format (gdbarch, &floatformat_ieee_double_big); tdep->gregset = regset_alloc (gdbarch, sparc32nbsd_supply_gregset, NULL); tdep->sizeof_gregset = 20 * 4; tdep->fpregset = regset_alloc (gdbarch, sparc32nbsd_supply_fpregset, NULL); tdep->sizeof_fpregset = 33 * 4; frame_unwind_append_sniffer (gdbarch, sparc32nbsd_sigtramp_frame_sniffer); }
static void sparc64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); linux_init_abi (info, gdbarch); tdep->gregset = regset_alloc (gdbarch, sparc64_linux_supply_core_gregset, sparc64_linux_collect_core_gregset); tdep->sizeof_gregset = 288; tdep->fpregset = regset_alloc (gdbarch, sparc64_linux_supply_core_fpregset, sparc64_linux_collect_core_fpregset); tdep->sizeof_fpregset = 280; tramp_frame_prepend_unwinder (gdbarch, &sparc64_linux_rt_sigframe); /* Hook in the DWARF CFI frame unwinder. */ dwarf2_append_unwinders (gdbarch); sparc64_init_abi (info, gdbarch); /* GNU/Linux has SVR4-style shared libraries... */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); /* ...which means that we need some special handling when doing prologue analysis. */ tdep->plt_entry_size = 16; /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Make sure we can single-step over signal return system calls. */ tdep->step_trap = sparc64_linux_step_trap; set_gdbarch_write_pc (gdbarch, sparc64_linux_write_pc); /* Functions for 'catch syscall'. */ set_xml_syscall_file_name (XML_SYSCALL_FILENAME_SPARC64); set_gdbarch_get_syscall_number (gdbarch, sparc64_linux_get_syscall_number); }
static void sparc32nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* NetBSD doesn't support the 128-bit `long double' from the psABI. */ set_gdbarch_long_double_bit (gdbarch, 64); set_gdbarch_long_double_format (gdbarch, floatformats_ieee_double); tdep->gregset = regset_alloc (gdbarch, sparc32nbsd_supply_gregset, NULL); tdep->sizeof_gregset = 20 * 4; tdep->fpregset = regset_alloc (gdbarch, sparc32nbsd_supply_fpregset, NULL); tdep->sizeof_fpregset = 33 * 4; /* Make sure we can single-step "new" syscalls. */ tdep->step_trap = sparcnbsd_step_trap; frame_unwind_append_unwinder (gdbarch, &sparc32nbsd_sigcontext_frame_unwind); }
static void sparc64nbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->gregset = regset_alloc (gdbarch, sparc64nbsd_supply_gregset, NULL); tdep->sizeof_gregset = 160; tdep->fpregset = regset_alloc (gdbarch, sparc64nbsd_supply_fpregset, NULL); tdep->sizeof_fpregset = 272; frame_unwind_append_sniffer (gdbarch, sparc64nbsd_sigtramp_frame_sniffer); sparc64_init_abi (info, gdbarch); /* NetBSD/sparc64 has SVR4-style shared libraries... */ set_gdbarch_in_solib_call_trampoline (gdbarch, in_plt_section); set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_lp64_fetch_link_map_offsets); }
static void sparc64fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = new_gdbarch_tdep(gdbarch); tdep->gregset = regset_alloc (gdbarch, sparc64fbsd_supply_gregset, sparc64fbsd_collect_gregset); tdep->sizeof_gregset = 256; tdep->fpregset = regset_alloc (gdbarch, sparc64fbsd_supply_fpregset, sparc64fbsd_collect_fpregset); tdep->sizeof_fpregset = 272; frame_unwind_append_sniffer (gdbarch, sparc64fbsd_sigtramp_frame_sniffer); sparc64_init_abi (info, gdbarch); /* FreeBSD/sparc64 has SVR4-style shared libraries: */ set_gdbarch_skip_trampoline_code(gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets(gdbarch, svr4_lp64_fetch_link_map_offsets); }
static void i386nto_supply_gregset (struct regcache *regcache, char *gpregs) { struct gdbarch *gdbarch = get_regcache_arch (regcache); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if(tdep->gregset == NULL) tdep->gregset = regset_alloc (gdbarch, i386_supply_gregset, i386_collect_gregset); gdb_assert (tdep->gregset_reg_offset == i386nto_gregset_reg_offset); tdep->gregset->supply_regset (tdep->gregset, regcache, -1, gpregs, NUM_GPREGS * 4); }
static void sparc32_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); tdep->gregset = regset_alloc (gdbarch, sparc32_linux_supply_core_gregset, sparc32_linux_collect_core_gregset); tdep->sizeof_gregset = 152; tdep->fpregset = regset_alloc (gdbarch, sparc32_linux_supply_core_fpregset, sparc32_linux_collect_core_fpregset); tdep->sizeof_fpregset = 396; tramp_frame_prepend_unwinder (gdbarch, &sparc32_linux_sigframe); tramp_frame_prepend_unwinder (gdbarch, &sparc32_linux_rt_sigframe); /* GNU/Linux has SVR4-style shared libraries... */ set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); set_solib_svr4_fetch_link_map_offsets (gdbarch, svr4_ilp32_fetch_link_map_offsets); /* ...which means that we need some special handling when doing prologue analysis. */ tdep->plt_entry_size = 12; /* Enable TLS support. */ set_gdbarch_fetch_tls_load_module_address (gdbarch, svr4_fetch_objfile_link_map); /* Make sure we can single-step over signal return system calls. */ tdep->step_trap = sparc32_linux_step_trap; /* Hook in the DWARF CFI frame unwinder. */ dwarf2_append_unwinders (gdbarch); set_gdbarch_write_pc (gdbarch, sparc_linux_write_pc); }
static const struct regset * i386_windows_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if (strcmp (sect_name, ".reg") == 0 && sect_size == I386_WINDOWS_SIZEOF_GREGSET) { if (tdep->gregset == NULL) tdep->gregset = regset_alloc (gdbarch, i386_supply_gregset, i386_collect_gregset); return tdep->gregset; } return NULL; }
static const struct regset * amd64_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); if (strcmp (sect_name, ".reg2") == 0 && sect_size == tdep->sizeof_fpregset) { if (tdep->fpregset == NULL) tdep->fpregset = regset_alloc (gdbarch, amd64_supply_fpregset, amd64_collect_fpregset); return tdep->fpregset; } return i386_regset_from_core_section (gdbarch, sect_name, sect_size); }
static const struct regset * amd64obsd_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); /* OpenBSD core dumps don't use seperate register sets for the general-purpose and floating-point registers. */ if (strcmp (sect_name, ".reg") == 0 && sect_size >= tdep->sizeof_gregset + I387_SIZEOF_FXSAVE) { if (tdep->gregset == NULL) tdep->gregset = regset_alloc (gdbarch, amd64obsd_supply_regset, NULL); return tdep->gregset; } return NULL; }