From 190b495d472576db66a8727d5872fcca3d5519c6 Mon Sep 17 00:00:00 2001 From: Walfred Tedeschi Date: Tue, 2 Feb 2016 11:50:17 +0100 Subject: [PATCH] Use linux_get_siginfo_type_with_fields for x86 Use linux_get_siginfo_type_with_fields for adding bound fields on segmentation fault for i386/amd64 siginfo. 2016-02-02 Walfred Tedeschi gdb/ChangeLog: * linux-tdep.h (linux_get_siginfo_type_with_fields): Make extern. * linux-tdep.c (linux_get_siginfo_type_with_fields): Make extern. * i386-linux-tdep.h (x86_linux_get_siginfo_type): New function. * amd64-linux-tdep.c (amd64_linux_init_abi_common): Add x86_linux_get_siginfo_type for the amd64 abi. * i386-linux-tdep.c (x86_linux_get_siginfo_type): New function. (i386_linux_init_abi): Add new function at the i386 ABI initialization. --- gdb/ChangeLog | 14 ++++++++++++++ gdb/amd64-linux-tdep.c | 2 ++ gdb/i386-linux-tdep.c | 8 ++++++++ gdb/i386-linux-tdep.h | 3 +++ gdb/linux-tdep.c | 5 ++--- gdb/linux-tdep.h | 5 +++++ 6 files changed, 34 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 89526e5e8a..25f7f169b8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2016-02-02 Walfred Tedeschi + + * linux-tdep.h (linux_get_siginfo_type_with_fields): Make extern. + * linux-tdep.c (linux_get_siginfo_type_with_fields): Make extern. + * i386-linux-tdep.h (x86_linux_get_siginfo_type): New + function. + * amd64-linux-tdep.c (amd64_linux_init_abi_common): Add + x86_linux_get_siginfo_type for the amd64 abi. + * i386-linux-tdep.c (x86_linux_get_siginfo_type): New + function. + (i386_linux_init_abi): Add new function at the i386 ABI + initialization. + + 2016-02-02 Walfred Tedeschi * linux-tdep.h (linux_siginfo_extra_field_values): New enum values. diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index b948ea77fa..21bcd99fe9 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -1838,6 +1838,8 @@ amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_process_record (gdbarch, i386_process_record); set_gdbarch_process_record_signal (gdbarch, amd64_linux_record_signal); + + set_gdbarch_get_siginfo_type (gdbarch, x86_linux_get_siginfo_type); } static void diff --git a/gdb/i386-linux-tdep.c b/gdb/i386-linux-tdep.c index 1e491e762a..af39e78c8d 100644 --- a/gdb/i386-linux-tdep.c +++ b/gdb/i386-linux-tdep.c @@ -656,6 +656,12 @@ i386_linux_supply_xstateregset (const struct regset *regset, i387_supply_xsave (regcache, regnum, xstateregs); } +struct type * +x86_linux_get_siginfo_type (struct gdbarch *gdbarch) +{ + return linux_get_siginfo_type_with_fields (gdbarch, LINUX_SIGINFO_FIELD_ADDR_BND); +} + /* Similar to i386_collect_fpregset, but use XSAVE extended state. */ static void @@ -994,6 +1000,8 @@ i386_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_xml_syscall_file_name (gdbarch, XML_SYSCALL_FILENAME_I386); set_gdbarch_get_syscall_number (gdbarch, i386_linux_get_syscall_number); + + set_gdbarch_get_siginfo_type (gdbarch, x86_linux_get_siginfo_type); } /* Provide a prototype to silence -Wmissing-prototypes. */ diff --git a/gdb/i386-linux-tdep.h b/gdb/i386-linux-tdep.h index ee6abff61a..ecc9e315d7 100644 --- a/gdb/i386-linux-tdep.h +++ b/gdb/i386-linux-tdep.h @@ -72,4 +72,7 @@ extern struct target_desc *tdesc_i386_avx512_linux; extern int i386_linux_gregset_reg_offset[]; +/* Return x86 siginfo type. */ +extern struct type *x86_linux_get_siginfo_type (struct gdbarch *gdbarch); + #endif /* i386-linux-tdep.h */ diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c index 375730611d..cfbec40b0e 100644 --- a/gdb/linux-tdep.c +++ b/gdb/linux-tdep.c @@ -243,10 +243,9 @@ get_linux_inferior_data (void) return info; } -/* This function is suitable for architectures that - extend/override the standard siginfo in a specific way. */ +/* See linux-tdep.h. */ -static struct type * +struct type * linux_get_siginfo_type_with_fields (struct gdbarch *gdbarch, linux_siginfo_extra_fields extra_fields) { diff --git a/gdb/linux-tdep.h b/gdb/linux-tdep.h index b2680f83f9..2da7de4d5a 100644 --- a/gdb/linux-tdep.h +++ b/gdb/linux-tdep.h @@ -36,6 +36,11 @@ enum linux_siginfo_extra_field_values DEF_ENUM_FLAGS_TYPE (enum linux_siginfo_extra_field_values, linux_siginfo_extra_fields); +/* This function is suitable for architectures that + extend/override the standard siginfo in a specific way. */ +struct type *linux_get_siginfo_type_with_fields (struct gdbarch *gdbarch, + linux_siginfo_extra_fields); + typedef char *(*linux_collect_thread_registers_ftype) (const struct regcache *, ptid_t, bfd *, char *, int *, -- 2.34.1