diff options
author | John Baldwin <jhb@FreeBSD.org> | 2017-08-04 20:16:33 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2017-08-04 20:16:33 +0000 |
commit | 67631b1bb9524a35fce397414c52b3aedf199cfe (patch) | |
tree | efa578222876378822d63d97ee10987874f1febf /devel/gdb/files/commit-762c974a09 | |
parent | Update devel/etcd32 to version 3.2.5. (diff) |
Backport support for fs_base/gs_base and $_siginfo from GDB master.
Bring in two patchsets committed to GDB master along with a few other commits
those patchsets depend on.
- Add support for examining $_siginfo. When a thread has valid signal
information, report the current information in a $_siginfo variable.
For live processes the values are extracted via the PT_LWPINFO ptrace
request. The values are also extracted from process core dumps that
include NT_LWPINFO notes (currently only present in FreeBSD 12-current).
- Add support for the $fs_base and $gs_base registers on amd64. This only
works for live processes via the PT_{GET,SET}{FS,GS}BASE ptrace requests.
FreeBSD currently does not store these values in core dumps, so they are
not available from core dumps.
Reviewed by: luca.pizzamiglio@gmail.com (maintainer)
Approved by: az, imp
Differential Revision: https://reviews.freebsd.org/D11813
Notes
Notes:
svn path=/head/; revision=447377
Diffstat (limited to 'devel/gdb/files/commit-762c974a09')
-rw-r--r-- | devel/gdb/files/commit-762c974a09 | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-762c974a09 b/devel/gdb/files/commit-762c974a09 new file mode 100644 index 000000000000..f7173b42aa1e --- /dev/null +++ b/devel/gdb/files/commit-762c974a09 @@ -0,0 +1,167 @@ +commit 762c974a09746bda8a5d64ed3ee887adeae742b9 +Author: John Baldwin <jhb@FreeBSD.org> +Date: Wed Jun 28 08:14:06 2017 -0700 + + Implement the "get_siginfo_type" gdbarch method for FreeBSD architectures. + + As with Linux architectures, cache the created type in the gdbarch when it + is first created. Currently FreeBSD uses an identical siginfo type on + all architectures, so there is no support for architecture-specific fields. + + gdb/ChangeLog: + + * fbsd-tdep.c (fbsd_gdbarch_data_handle, struct fbsd_gdbarch_data) + (init_fbsd_gdbarch_data, get_fbsd_gdbarch_data) + (fbsd_get_siginfo_type): New. + (fbsd_init_abi): Install gdbarch "get_siginfo_type" method. + (_initialize_fbsd_tdep): New. + +diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c +index b834ce38b4..24a3c20dd6 100644 +--- gdb/fbsd-tdep.c ++++ gdb/fbsd-tdep.c +@@ -30,6 +30,26 @@ + #include "fbsd-tdep.h" + + ++static struct gdbarch_data *fbsd_gdbarch_data_handle; ++ ++struct fbsd_gdbarch_data ++ { ++ struct type *siginfo_type; ++ }; ++ ++static void * ++init_fbsd_gdbarch_data (struct gdbarch *gdbarch) ++{ ++ return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct fbsd_gdbarch_data); ++} ++ ++static struct fbsd_gdbarch_data * ++get_fbsd_gdbarch_data (struct gdbarch *gdbarch) ++{ ++ return ((struct fbsd_gdbarch_data *) ++ gdbarch_data (gdbarch, fbsd_gdbarch_data_handle)); ++} ++ + /* This is how we want PTIDs from core files to be printed. */ + + static const char * +@@ -314,6 +334,97 @@ fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file, + fprint_auxv_entry (file, name, description, format, type, val); + } + ++/* Implement the "get_siginfo_type" gdbarch method. */ ++ ++static struct type * ++fbsd_get_siginfo_type (struct gdbarch *gdbarch) ++{ ++ struct fbsd_gdbarch_data *fbsd_gdbarch_data; ++ struct type *int_type, *int32_type, *uint32_type, *long_type, *void_ptr_type; ++ struct type *uid_type, *pid_type; ++ struct type *sigval_type, *reason_type; ++ struct type *siginfo_type; ++ struct type *type; ++ ++ fbsd_gdbarch_data = get_fbsd_gdbarch_data (gdbarch); ++ if (fbsd_gdbarch_data->siginfo_type != NULL) ++ return fbsd_gdbarch_data->siginfo_type; ++ ++ int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), ++ 0, "int"); ++ int32_type = arch_integer_type (gdbarch, 32, 0, "int32_t"); ++ uint32_type = arch_integer_type (gdbarch, 32, 1, "uint32_t"); ++ long_type = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch), ++ 0, "long"); ++ void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void); ++ ++ /* union sigval */ ++ sigval_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION); ++ TYPE_NAME (sigval_type) = xstrdup ("sigval"); ++ append_composite_type_field (sigval_type, "sival_int", int_type); ++ append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type); ++ ++ /* __pid_t */ ++ pid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF, ++ TYPE_LENGTH (int32_type), "__pid_t"); ++ TYPE_TARGET_TYPE (pid_type) = int32_type; ++ TYPE_TARGET_STUB (pid_type) = 1; ++ ++ /* __uid_t */ ++ uid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF, ++ TYPE_LENGTH (uint32_type), "__uid_t"); ++ TYPE_TARGET_TYPE (uid_type) = uint32_type; ++ TYPE_TARGET_STUB (uid_type) = 1; ++ ++ /* _reason */ ++ reason_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION); ++ ++ /* _fault */ ++ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); ++ append_composite_type_field (type, "si_trapno", int_type); ++ append_composite_type_field (reason_type, "_fault", type); ++ ++ /* _timer */ ++ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); ++ append_composite_type_field (type, "si_timerid", int_type); ++ append_composite_type_field (type, "si_overrun", int_type); ++ append_composite_type_field (reason_type, "_timer", type); ++ ++ /* _mesgq */ ++ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); ++ append_composite_type_field (type, "si_mqd", int_type); ++ append_composite_type_field (reason_type, "_mesgq", type); ++ ++ /* _poll */ ++ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); ++ append_composite_type_field (type, "si_band", long_type); ++ append_composite_type_field (reason_type, "_poll", type); ++ ++ /* __spare__ */ ++ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); ++ append_composite_type_field (type, "__spare1__", long_type); ++ append_composite_type_field (type, "__spare2__", ++ init_vector_type (int_type, 7)); ++ append_composite_type_field (reason_type, "__spare__", type); ++ ++ /* struct siginfo */ ++ siginfo_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT); ++ TYPE_NAME (siginfo_type) = xstrdup ("siginfo"); ++ append_composite_type_field (siginfo_type, "si_signo", int_type); ++ append_composite_type_field (siginfo_type, "si_errno", int_type); ++ append_composite_type_field (siginfo_type, "si_code", int_type); ++ append_composite_type_field (siginfo_type, "si_pid", pid_type); ++ append_composite_type_field (siginfo_type, "si_uid", uid_type); ++ append_composite_type_field (siginfo_type, "si_status", int_type); ++ append_composite_type_field (siginfo_type, "si_addr", void_ptr_type); ++ append_composite_type_field (siginfo_type, "si_value", sigval_type); ++ append_composite_type_field (siginfo_type, "_reason", reason_type); ++ ++ fbsd_gdbarch_data->siginfo_type = siginfo_type; ++ ++ return siginfo_type; ++} ++ + /* Implement the "get_syscall_number" gdbarch method. */ + + static LONGEST +@@ -339,8 +450,19 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) + set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name); + set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes); + set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry); ++ set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type); + + /* `catch syscall' */ + set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml"); + set_gdbarch_get_syscall_number (gdbarch, fbsd_get_syscall_number); + } ++ ++/* Provide a prototype to silence -Wmissing-prototypes. */ ++extern initialize_file_ftype _initialize_fbsd_tdep; ++ ++void ++_initialize_fbsd_tdep (void) ++{ ++ fbsd_gdbarch_data_handle = ++ gdbarch_data_register_post_init (init_fbsd_gdbarch_data); ++} |