aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2017-10-05 09:50:01 -0700
committerJohn Baldwin <jhb@FreeBSD.org>2017-10-05 09:50:01 -0700
commita80a647180bf92692e0f01efe7b323afe7d317c9 (patch)
treeb0f81a66babbe750e7c6eafdde5c579397a682ed /gdb
parent6d5be5d6b8b4412e65bc037472aa2e727c25ccf5 (diff)
downloadgdb-a80a647180bf92692e0f01efe7b323afe7d317c9.zip
gdb-a80a647180bf92692e0f01efe7b323afe7d317c9.tar.gz
gdb-a80a647180bf92692e0f01efe7b323afe7d317c9.tar.bz2
Add a signal frame unwinder for FreeBSD/mipsn32.
The N32 signal frame uses an identical layout to N64, so reuse the N64 handler. The N32 signal trampoline does use one different instruction relative to N64, so a separate tramp_frame is required. gdb/ChangeLog: * mips-fbsd-tdep.c (MIPS_INST_ADDIU_A0_SP_N32): Define. (mipsn32_fbsd_sigframe): Define. (mips_fbsd_init_abi): Install mipsn32_fbsd_sigframe unwinder for FreeBSD/mipsn32.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/mips-fbsd-tdep.c18
2 files changed, 25 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 2ffa23f..024664f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2017-10-05 John Baldwin <jhb@FreeBSD.org>
+ * mips-fbsd-tdep.c (MIPS_INST_ADDIU_A0_SP_N32): Define.
+ (mipsn32_fbsd_sigframe): Define.
+ (mips_fbsd_init_abi): Install mipsn32_fbsd_sigframe unwinder
+ for FreeBSD/mipsn32.
+
+2017-10-05 John Baldwin <jhb@FreeBSD.org>
+
* fbsd-tdep.c (fbsd_print_auxv_entry): Handle AT_EHDRFLAGS and
AT_HWCAP.
diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c
index 05545e3..b1578d0 100644
--- a/gdb/mips-fbsd-tdep.c
+++ b/gdb/mips-fbsd-tdep.c
@@ -426,6 +426,23 @@ mips64_fbsd_sigframe_init (const struct tramp_frame *self,
trad_frame_set_id (cache, frame_id_build (sp, func));
}
+#define MIPS_INST_ADDIU_A0_SP_N32 (0x27a40000 \
+ + N64_SIGFRAME_UCONTEXT_OFFSET)
+
+static const struct tramp_frame mipsn32_fbsd_sigframe =
+{
+ SIGTRAMP_FRAME,
+ MIPS_INSN32_SIZE,
+ {
+ { MIPS_INST_ADDIU_A0_SP_N32, -1 }, /* addiu a0, sp, SIGF_UC */
+ { MIPS_INST_LI_V0_SIGRETURN, -1 }, /* li v0, SYS_sigreturn */
+ { MIPS_INST_SYSCALL, -1 }, /* syscall */
+ { MIPS_INST_BREAK, -1 }, /* break */
+ { TRAMP_SENTINEL_INSN, -1 }
+ },
+ mips64_fbsd_sigframe_init
+};
+
#define MIPS_INST_DADDIU_A0_SP_N64 (0x67a40000 \
+ N64_SIGFRAME_UCONTEXT_OFFSET)
@@ -519,6 +536,7 @@ mips_fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
tramp_frame_prepend_unwinder (gdbarch, &mips_fbsd_sigframe);
break;
case MIPS_ABI_N32:
+ tramp_frame_prepend_unwinder (gdbarch, &mipsn32_fbsd_sigframe);
break;
case MIPS_ABI_N64:
tramp_frame_prepend_unwinder (gdbarch, &mips64_fbsd_sigframe);