42#include "gdbsupport/x86-xstate.h"
45#define XML_SYSCALL_FILENAME_I386 "syscalls/i386-linux.xml"
105#define LINUX_SIGTRAMP_INSN0 0x58
106#define LINUX_SIGTRAMP_OFFSET0 0
107#define LINUX_SIGTRAMP_INSN1 0xb8
108#define LINUX_SIGTRAMP_OFFSET1 1
109#define LINUX_SIGTRAMP_INSN2 0xcd
110#define LINUX_SIGTRAMP_OFFSET2 6
119#define LINUX_SIGTRAMP_LEN (sizeof linux_sigtramp_code)
176#define LINUX_RT_SIGTRAMP_INSN0 0xb8
177#define LINUX_RT_SIGTRAMP_OFFSET0 0
178#define LINUX_RT_SIGTRAMP_INSN1 0xcd
179#define LINUX_RT_SIGTRAMP_OFFSET1 5
187#define LINUX_RT_SIGTRAMP_LEN (sizeof linux_rt_sigtramp_code)
242 if (
name == NULL || strstr (
name,
"sigaction") != NULL)
246 return (strcmp (
"__restore",
name) == 0
247 || strcmp (
"__restore_rt",
name) == 0);
264 if (
name && (strcmp (
name,
"__kernel_sigreturn") == 0
265 || strcmp (
name,
"__kernel_rt_sigreturn") == 0))
272#define I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET 20
306 CORE_ADDR ucontext_addr;
316 error (_(
"Couldn't recognize signal trampoline."));
379 enum { i386_syscall_max = 499 };
381 if (
syscall <= i386_syscall_max)
389#define SIG_CODE_BOUNDARY_FAULT 3
396 enum gdb_signal siggnal)
399 CORE_ADDR lower_bound = 0, upper_bound = 0, access = 0;
418 catch (
const gdb_exception_error &exception)
427 is_upper = (access > upper_bound ? 1 : 0);
431 uiout->
field_string (
"sigcode-meaning", _(
"Upper bound violation"));
433 uiout->
field_string (
"sigcode-meaning", _(
"Lower bound violation"));
435 uiout->
text (_(
" while accessing address "));
438 uiout->
text (_(
"\nBounds: [lower = "));
441 uiout->
text (_(
", upper = "));
444 uiout->
text (_(
"]"));
460 LONGEST syscall_native;
470 _(
"Process record and replay target doesn't "
471 "support syscall number %s\n"),
472 plongest (syscall_native));
496#define I386_LINUX_xstate 270
497#define I386_LINUX_frame_size 732
502 enum gdb_signal signal)
604 -1, -1, -1, -1, -1, -1, -1, -1,
605 -1, -1, -1, -1, -1, -1, -1, -1,
606 -1, -1, -1, -1, -1, -1, -1, -1,
608 -1, -1, -1, -1, -1, -1, -1, -1,
611 -1, -1, -1, -1, -1, -1, -1, -1,
612 -1, -1, -1, -1, -1, -1, -1, -1,
646 asection *xstate = bfd_get_section_by_name (abfd,
".reg-xstate");
647 if (xstate ==
nullptr)
651 size_t size = bfd_section_size (xstate);
652 if (
size < X86_XSTATE_AVX_SIZE)
656 if (! bfd_get_section_contents (abfd, xstate, contents,
659 warning (_(
"Couldn't read `xcr0' bytes from "
660 "`.reg-xstate' section in core file."));
664 uint64_t xcr0 = bfd_get_64 (abfd, contents);
676 x86_xsave_layout &layout)
690 [2][2][2][2][2][2] = {};
693 tdesc = &i386_linux_tdescs[(xcr0 & X86_XSTATE_X87) ? 1 : 0]
694 [(xcr0 & X86_XSTATE_SSE) ? 1 : 0]
695 [(xcr0 & X86_XSTATE_AVX) ? 1 : 0]
696 [(xcr0 & X86_XSTATE_MPX) ? 1 : 0]
697 [(xcr0 & X86_XSTATE_AVX512) ? 1 : 0]
698 [(xcr0 & X86_XSTATE_PKRU) ? 1 : 0];
714 x86_xsave_layout layout;
721 if (bfd_get_section_by_name (abfd,
".reg-xfp") != NULL)
732 const void *xstateregs,
size_t len)
748 int regnum,
void *xstateregs,
size_t len)
777 "XSAVE extended state", cb_data);
778 else if (tdep->
xcr0 & X86_XSTATE_SSE)
779 cb (
".reg-xfp", 512, 512, &
i386_fpregset,
"extended floating-point",
809 CORE_ADDR from, CORE_ADDR to,
823 closure->
buf[0] = 0x90;
833 const struct target_desc *tdesc = info.target_desc;
835 const struct tdesc_feature *feature;
bool find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr, const struct block **block)
enum register_status cooked_read(int regnum, gdb_byte *buf)
void field_core_addr(const char *fldname, struct gdbarch *gdbarch, CORE_ADDR address)
void field_string(const char *fldname, const char *string, const ui_file_style &style=ui_file_style())
void text(const char *string)
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)
std::unique_ptr< displaced_step_copy_insn_closure > displaced_step_copy_insn_closure_up
void dwarf2_frame_set_signal_frame_p(struct gdbarch *gdbarch, int(*signal_frame_p)(struct gdbarch *, frame_info_ptr))
LONGEST parse_and_eval_long(const char *exp)
CORE_ADDR get_frame_pc(frame_info_ptr frame)
void get_frame_register(frame_info_ptr frame, int regnum, gdb_byte *buf)
struct gdbarch * get_frame_arch(frame_info_ptr this_frame)
bool safe_frame_unwind_memory(frame_info_ptr this_frame, CORE_ADDR addr, gdb::array_view< gdb_byte > buffer)
void set_gdbarch_process_record(struct gdbarch *gdbarch, gdbarch_process_record_ftype *process_record)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
void set_gdbarch_sofun_address_maybe_missing(struct gdbarch *gdbarch, int sofun_address_maybe_missing)
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_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype *skip_trampoline_code)
void set_gdbarch_get_syscall_number(struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype *get_syscall_number)
void set_gdbarch_get_siginfo_type(struct gdbarch *gdbarch, gdbarch_get_siginfo_type_ftype *get_siginfo_type)
int gdbarch_int_bit(struct gdbarch *gdbarch)
void set_gdbarch_displaced_step_copy_insn(struct gdbarch *gdbarch, gdbarch_displaced_step_copy_insn_ftype *displaced_step_copy_insn)
void set_gdbarch_core_read_x86_xsave_layout(struct gdbarch *gdbarch, gdbarch_core_read_x86_xsave_layout_ftype *core_read_x86_xsave_layout)
void set_gdbarch_displaced_step_fixup(struct gdbarch *gdbarch, gdbarch_displaced_step_fixup_ftype *displaced_step_fixup)
void set_gdbarch_report_signal_info(struct gdbarch *gdbarch, gdbarch_report_signal_info_ftype *report_signal_info)
void set_gdbarch_process_record_signal(struct gdbarch *gdbarch, gdbarch_process_record_signal_ftype *process_record_signal)
void set_gdbarch_fetch_tls_load_module_address(struct gdbarch *gdbarch, gdbarch_fetch_tls_load_module_address_ftype *fetch_tls_load_module_address)
void set_gdbarch_num_regs(struct gdbarch *gdbarch, int num_regs)
int gdbarch_long_bit(struct gdbarch *gdbarch)
int gdbarch_ptr_bit(struct gdbarch *gdbarch)
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)
CORE_ADDR glibc_skip_solib_resolver(struct gdbarch *gdbarch, CORE_ADDR pc)
static int i386_linux_record_signal(struct gdbarch *gdbarch, struct regcache *regcache, enum gdb_signal signal)
#define LINUX_SIGTRAMP_INSN1
struct type * x86_linux_get_siginfo_type(struct gdbarch *gdbarch)
#define LINUX_SIGTRAMP_LEN
static LONGEST i386_linux_get_syscall_number(struct gdbarch *gdbarch, thread_info *thread)
int i386_linux_gregset_reg_offset[]
static int i386_linux_sc_reg_offset[]
static int i386_linux_register_reggroup_p(struct gdbarch *gdbarch, int regnum, const struct reggroup *group)
#define I386_LINUX_UCONTEXT_SIGCONTEXT_OFFSET
static enum gdb_syscall i386_canonicalize_syscall(int syscall)
static void i386_linux_collect_xstateregset(const struct regset *regset, const struct regcache *regcache, int regnum, void *xstateregs, size_t len)
static const gdb_byte linux_sigtramp_code[]
static const gdb_byte linux_rt_sigtramp_code[]
void _initialize_i386_linux_tdep()
#define LINUX_SIGTRAMP_INSN0
#define XML_SYSCALL_FILENAME_I386
bool i386_linux_core_read_x86_xsave_layout(struct gdbarch *gdbarch, x86_xsave_layout &layout)
static LONGEST i386_linux_get_syscall_number_from_regcache(struct regcache *regcache)
static const struct target_desc * i386_linux_core_read_description(struct gdbarch *gdbarch, struct target_ops *target, bfd *abfd)
static void i386_linux_supply_xstateregset(const struct regset *regset, struct regcache *regcache, int regnum, const void *xstateregs, size_t len)
static void i386_linux_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
static int i386_linux_dwarf_signal_frame_p(struct gdbarch *gdbarch, frame_info_ptr this_frame)
#define I386_LINUX_frame_size
static CORE_ADDR i386_linux_sigtramp_start(frame_info_ptr this_frame)
static displaced_step_copy_insn_closure_up i386_linux_displaced_step_copy_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
uint64_t i386_linux_core_read_xsave_info(bfd *abfd, x86_xsave_layout &layout)
static CORE_ADDR i386_linux_rt_sigtramp_start(frame_info_ptr this_frame)
static struct linux_record_tdep i386_linux_record_tdep
static int i386_all_but_ip_registers_record(struct regcache *regcache)
const struct target_desc * i386_linux_read_description(uint64_t xcr0)
#define LINUX_RT_SIGTRAMP_OFFSET1
#define I386_LINUX_xstate
#define LINUX_RT_SIGTRAMP_INSN0
#define LINUX_RT_SIGTRAMP_INSN1
#define LINUX_RT_SIGTRAMP_LEN
static int i386_linux_sigtramp_p(frame_info_ptr this_frame)
#define LINUX_SIGTRAMP_INSN2
static void i386_linux_write_pc(struct regcache *regcache, CORE_ADDR pc)
#define LINUX_SIGTRAMP_OFFSET1
static const struct regset i386_linux_xstateregset
#define SIG_CODE_BOUNDARY_FAULT
static void i386_linux_iterate_over_regset_sections(struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache)
static int i386_linux_intx80_sysenter_syscall_record(struct regcache *regcache)
void i386_linux_report_signal_info(struct gdbarch *gdbarch, struct ui_out *uiout, enum gdb_signal siggnal)
static CORE_ADDR i386_linux_sigcontext_addr(frame_info_ptr this_frame)
#define LINUX_SIGTRAMP_OFFSET2
#define I386_LINUX_NUM_REGS
#define I386_LINUX_XSAVE_XCR0_OFFSET
#define I386_LINUX_ORIG_EAX_REGNUM
int i386_register_reggroup_p(struct gdbarch *gdbarch, int regnum, const struct reggroup *group)
const struct regset i386_fpregset
int i386_process_record(struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR input_addr)
const struct regset i386_gregset
displaced_step_copy_insn_closure_up i386_displaced_step_copy_insn(struct gdbarch *gdbarch, CORE_ADDR from, CORE_ADDR to, struct regcache *regs)
void i386_displaced_step_fixup(struct gdbarch *gdbarch, struct displaced_step_copy_insn_closure *closure_, CORE_ADDR from, CORE_ADDR to, struct regcache *regs, bool completed_p)
void i386_elf_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
int i386_mpx_enabled(void)
target_desc * i386_create_target_description(uint64_t xcr0, bool is_linux, bool segments)
void i387_supply_xsave(struct regcache *regcache, int regnum, const void *xsave)
bool i387_guess_xsave_layout(uint64_t xcr0, size_t xsave_size, x86_xsave_layout &layout)
void i387_collect_xsave(const struct regcache *regcache, int regnum, void *xsave, int gcore)
int record_linux_system_call(enum gdb_syscall syscall, struct regcache *regcache, struct linux_record_tdep *tdep)
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 type * linux_get_siginfo_type_with_fields(struct gdbarch *gdbarch, linux_siginfo_extra_fields extra_fields)
@ LINUX_SIGINFO_FIELD_ADDR_BND
CORE_ADDR find_solib_trampoline_target(frame_info_ptr frame, CORE_ADDR pc)
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
int record_full_arch_list_add_reg(struct regcache *regcache, int regnum)
int record_full_arch_list_add_mem(CORE_ADDR addr, int len)
int record_full_arch_list_add_end(void)
enum register_status regcache_raw_read_signed(struct regcache *regcache, int regnum, LONGEST *val)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
struct regcache * get_thread_regcache(process_stratum_target *target, ptid_t ptid)
void regcache_cooked_write_unsigned(struct regcache *regcache, int regnum, ULONGEST val)
const reggroup *const system_reggroup
const reggroup *const save_reggroup
const reggroup *const restore_reggroup
void set_solib_svr4_fetch_link_map_offsets(struct gdbarch *gdbarch, struct link_map_offsets *(*flmo)(void))
CORE_ADDR svr4_fetch_objfile_link_map(struct objfile *objfile)
int(* i386_syscall_record)(struct regcache *regcache)
int(* i386_intx80_record)(struct regcache *regcache)
int(* sigtramp_p)(frame_info_ptr)
x86_xsave_layout xsave_layout
gdbarch_register_reggroup_p_ftype * register_reggroup_p
CORE_ADDR(* sigcontext_addr)(frame_info_ptr)
const struct target_desc * tdesc
int(* i386_sysenter_record)(struct regcache *regcache)
ULONGEST ioctl_TIOCGLCKTRMIOS
ULONGEST ioctl_TIOCMIWAIT
ULONGEST ioctl_TIOCGICOUNT
ULONGEST ioctl_TIOCSERGSTRUCT
ULONGEST ioctl_TIOCSERGETMULTI
ULONGEST ioctl_TIOCSERCONFIG
ULONGEST ioctl_TIOCSSOFTCAR
ULONGEST ioctl_TIOCSWINSZ
ULONGEST ioctl_TIOCTTYGSTRUCT
int size_hayes_esp_config
ULONGEST ioctl_TIOCSERSETMULTI
ULONGEST ioctl_TIOCSSERIAL
int size_serial_icounter_struct
ULONGEST ioctl_TIOCSPTLCK
ULONGEST ioctl_TIOCGSOFTCAR
ULONGEST ioctl_TIOCGSERIAL
ULONGEST ioctl_TIOCSERGETLSR
ULONGEST ioctl_TIOCGWINSZ
ULONGEST ioctl_TIOCSERGWILD
ULONGEST ioctl_TIOCSLCKTRMIOS
ULONGEST ioctl_TIOCSHAYESESP
ULONGEST ioctl_TIOCGHAYESESP
ULONGEST ioctl_TIOCSERSWILD
int size__old_kernel_stat
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)
void gdb_printf(struct ui_file *stream, const char *format,...)
void set_xml_syscall_file_name(struct gdbarch *gdbarch, const char *name)