summaryrefslogtreecommitdiff
path: root/devel/gdb/files/commit-762c974a09
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2017-08-04 20:16:33 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2017-08-04 20:16:33 +0000
commit67631b1bb9524a35fce397414c52b3aedf199cfe (patch)
treeefa578222876378822d63d97ee10987874f1febf /devel/gdb/files/commit-762c974a09
parentUpdate 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-762c974a09167
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);
++}