This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[PATCH] Fix OpenBSD/amd64 signal trampoline detection
- From: Mark Kettenis <kettenis at chello dot nl>
- To: gdb-patches at sources dot redhat dot com
- Date: Sat, 29 May 2004 18:02:15 +0200 (CEST)
- Subject: [PATCH] Fix OpenBSD/amd64 signal trampoline detection
OpenBSD recently upgraded to a newer binutils, which encodes the `movq
%sp, %rdi' instruction in a more efficient way, breaking our signal
trampoline detection stuff. This patch adjusts things such that we
detect both the old and the new signal trampoline code.
Committed,
Mark
Index: ChangeLog
from Mark Kettenis <kettenis@gnu.org>
* amd64obsd-tdep.c (amd64obsd_sigtramp_p): Adjust for new
assembler in OpenBSD 3.5-current.
(amd64obsd_sigcontext_addr): Likewise.
Index: amd64obsd-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/amd64obsd-tdep.c,v
retrieving revision 1.13
diff -u -p -r1.13 amd64obsd-tdep.c
--- amd64obsd-tdep.c 22 May 2004 15:16:22 -0000 1.13
+++ amd64obsd-tdep.c 29 May 2004 12:34:19 -0000
@@ -104,12 +104,15 @@ amd64obsd_sigtramp_p (struct frame_info
return 0;
/* If we can't read the instructions at START_PC, return zero. */
- buf = alloca (sizeof sigreturn);
- if (target_read_memory (start_pc + 7, buf, sizeof sigreturn))
+ buf = alloca ((sizeof sigreturn) + 1);
+ if (target_read_memory (start_pc + 6, buf, (sizeof sigreturn) + 1))
return 0;
- /* Check for sigreturn(2). */
- if (memcmp (buf, sigreturn, sizeof sigreturn))
+ /* Check for sigreturn(2). Depending on how the assembler encoded
+ the `movq %rsp, %rdi' instruction, the code starts at offset 6 or
+ 7. */
+ if (memcmp (buf, sigreturn, sizeof sigreturn)
+ && memcpy (buf + 1, sigreturn, sizeof sigreturn))
return 0;
return 1;
@@ -136,7 +139,7 @@ amd64obsd_sigcontext_addr (struct frame_
(see /usr/src/sys/arch/amd64/amd64/locore.S). The `pushq'
instruction clobbers %rsp, but its value is saved in `%rdi'. */
- if (offset > 6)
+ if (offset > 5)
return frame_unwind_register_unsigned (next_frame, AMD64_RDI_REGNUM);
else
return frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);