diff mbox

[2/2] Add a signal frame unwinder for FreeBSD/mipsn32.

Message ID 20170919204814.93328-3-jhb@FreeBSD.org
State New
Headers show

Commit Message

John Baldwin Sept. 19, 2017, 8:48 p.m. UTC
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.
---
 gdb/ChangeLog        |  7 +++++++
 gdb/mips-fbsd-tdep.c | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

Comments

Pedro Alves Oct. 11, 2017, 11:16 a.m. UTC | #1
On 09/19/2017 09:48 PM, John Baldwin wrote:
> 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.

LGTM.

Thanks,
Pedro Alves
diff mbox

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4d544f116a..261df9d477 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@ 
 2017-09-19  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-09-19  John Baldwin  <jhb@FreeBSD.org>
+
 	* NEWS (Changes since GDB 8.0): Add starti.
 	* infcmd.c (enum run_break): New.
 	(run_command_1): Queue pending event for RUN_STOP_AT_FIRST_INSN
diff --git a/gdb/mips-fbsd-tdep.c b/gdb/mips-fbsd-tdep.c
index 05545e37d8..b1578d0cbb 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);