* amd64obsd-tdep.c (amd64obsd_sigtramp_p): Replace hexadecimal
authorMark Kettenis <kettenis@gnu.org>
Sat, 15 May 2004 21:06:50 +0000 (21:06 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 15 May 2004 21:06:50 +0000 (21:06 +0000)
offset with decimal offset.
(amd64obsd_sigcontext_addr): Return correct address for entire
signal trampoline.

gdb/ChangeLog
gdb/amd64obsd-tdep.c

index 9f546b46f02b969de7783ef19a9349470e1ede10..04e8da8a8934bb5f85b553ab7de76dc1bcd35cd3 100644 (file)
@@ -1,5 +1,10 @@
 2004-05-15  Mark Kettenis  <kettenis@gnu.org>
 
+       * amd64obsd-tdep.c (amd64obsd_sigtramp_p): Replace hexadecimal
+       offset with decimal offset.
+       (amd64obsd_sigcontext_addr): Return correct address for entire
+       signal trampoline.
+
        * vax-tdep.c (vax_frame_num_args): Use get_frame_base_address
        instead of get_frame_base.
 
index af110b3447c0ed09f85ac03b198bfeeceaf9f2d4..f9e0f69fe6ec9a627ddfc21ccad1d2d5e4dd01b8 100644 (file)
@@ -109,7 +109,7 @@ amd64obsd_sigtramp_p (struct frame_info *next_frame)
 
   /* If we can't read the instructions at START_PC, return zero.  */
   buf = alloca (sizeof sigreturn);
-  if (target_read_memory (start_pc + 0x7, buf, sizeof sigreturn))
+  if (target_read_memory (start_pc + 7, buf, sizeof sigreturn))
     return 0;
 
   /* Check for sigreturn(2).  */
@@ -125,9 +125,25 @@ amd64obsd_sigtramp_p (struct frame_info *next_frame)
 static CORE_ADDR
 amd64obsd_sigcontext_addr (struct frame_info *next_frame)
 {
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
+  ULONGEST offset = (pc & (amd64obsd_page_size - 1));
+
   /* The %rsp register points at `struct sigcontext' upon entry of a
-     signal trampoline.  */
-  return frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);
+     signal trampoline.  The relevant part of the trampoline is
+
+        call    *%rax
+        movq    %rsp, %rdi
+        pushq   %rdi
+        movq    $SYS_sigreturn,%rax
+        int     $0x80
+
+     (see /usr/src/sys/arch/amd64/amd64/locore.S).  The `pushq'
+     instruction clobbers %rsp, but its value is saved in `%rdi'.  */
+
+  if (offset > 6)
+    return frame_unwind_register_unsigned (next_frame, AMD64_RDI_REGNUM);
+  else
+    return frame_unwind_register_unsigned (next_frame, AMD64_RSP_REGNUM);
 }
 \f
 /* OpenBSD 3.5 or later.  */