This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]