* amd64obsd-tdep.c (amd64obsd_sigtramp_p): Detect new signal
authorMark Kettenis <kettenis@gnu.org>
Sat, 17 Dec 2011 12:22:06 +0000 (12:22 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 17 Dec 2011 12:22:06 +0000 (12:22 +0000)
trampoline to be introduced in OpenBSD 5.0.

gdb/ChangeLog
gdb/amd64obsd-tdep.c

index b2bf0636c4fb03bcb44b39789e6f98038462efe4..296feb7e2e232c5fb7e501aa06d6e56a64de1418 100644 (file)
@@ -1,3 +1,8 @@
+2011-12-17  Mark Kettenis  <kettenis@gnu.org>
+
+       * amd64obsd-tdep.c (amd64obsd_sigtramp_p): Detect new signal
+       trampoline to be introduced in OpenBSD 5.0.
+
 2011-12-17  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        Fix build regression from the PR threads/10729 fix.
index 2ff5c8f91828f92c6720cf0c58d47d7a5219ce3b..e66cd2b1794d85cfd3cf86ce09dcd44e22cadc27 100644 (file)
@@ -88,12 +88,18 @@ amd64obsd_sigtramp_p (struct frame_info *this_frame)
 {
   CORE_ADDR pc = get_frame_pc (this_frame);
   CORE_ADDR start_pc = (pc & ~(amd64obsd_page_size - 1));
-  const gdb_byte sigreturn[] =
+  const gdb_byte osigreturn[] =
   {
     0x48, 0xc7, 0xc0,
     0x67, 0x00, 0x00, 0x00,    /* movq $SYS_sigreturn, %rax */
     0xcd, 0x80                 /* int $0x80 */
   };
+  const gdb_byte sigreturn[] =
+  {
+    0x48, 0xc7, 0xc0,
+    0x67, 0x00, 0x00, 0x00,    /* movq $SYS_sigreturn, %rax */
+    0x0f, 0x05                 /* syscall */
+  };
   size_t buflen = (sizeof sigreturn) + 1;
   gdb_byte *buf;
   char *name;
@@ -116,9 +122,12 @@ amd64obsd_sigtramp_p (struct frame_info *this_frame)
 
   /* Check for sigreturn(2).  Depending on how the assembler encoded
      the `movq %rsp, %rdi' instruction, the code starts at offset 6 or
-     7.  */
+     7.  OpenBSD 5.0 and later use the `syscall' instruction.  Older
+     versions use `int $0x80'.  Check for both.  */
   if (memcmp (buf, sigreturn, sizeof sigreturn)
-      && memcpy (buf + 1, sigreturn, sizeof sigreturn))
+      && memcmp (buf + 1, sigreturn, sizeof sigreturn)
+      && memcmp (buf, osigreturn, sizeof osigreturn)
+      && memcmp (buf + 1, osigreturn, sizeof osigreturn))
     return 0;
 
   return 1;