summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2003-05-28 20:52:03 +0000
committerMark Kettenis <kettenis@gnu.org>2003-05-28 20:52:03 +0000
commit4f078bbd6c94d431c8cfb48a9bf89351063a0767 (patch)
tree84853e8cad0215b34a098c1b5c3db8e5a1de76af
parentf7e2f7efcffae8fca9d11e697e9fbd842ec93629 (diff)
downloadbinutils-gdb-4f078bbd6c94d431c8cfb48a9bf89351063a0767.tar.gz
* x86-64-linux-tdep.c (x86_64_linux_sigcontext_addr): Fix.
-rw-r--r--gdb/ChangeLog4
-rw-r--r--gdb/x86-64-linux-tdep.c11
2 files changed, 10 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 58a77877056..4465ef1ee4d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,7 @@
+2003-05-28 Mark Kettenis <kettenis@gnu.org>
+
+ * x86-64-linux-tdep.c (x86_64_linux_sigcontext_addr): Fix.
+
2003-05-23 Mark Kettenis <kettenis@gnu.org>
* i386-tdep.c, dwarf-frame.c, dwarf-frame.h: Use dwarf2_ instead
diff --git a/gdb/x86-64-linux-tdep.c b/gdb/x86-64-linux-tdep.c
index aa75537bccc..5615ebd2681 100644
--- a/gdb/x86-64-linux-tdep.c
+++ b/gdb/x86-64-linux-tdep.c
@@ -107,7 +107,7 @@ x86_64_linux_pc_in_sigtramp (CORE_ADDR pc, char *name)
static CORE_ADDR
x86_64_linux_sigcontext_addr (struct frame_info *next_frame)
{
- CORE_ADDR sp, ucontext_addr;
+ CORE_ADDR sp;
char buf[8];
frame_unwind_register (next_frame, SP_REGNUM, buf);
@@ -115,10 +115,11 @@ x86_64_linux_sigcontext_addr (struct frame_info *next_frame)
/* The sigcontext structure is part of the user context. A pointer
to the user context is passed as the third argument to the signal
- handler. */
- read_memory (sp + 16, buf, 8);
- ucontext_addr = extract_unsigned_integer (buf, 8);
- return ucontext_addr + X86_64_LINUX_UCONTEXT_SIGCONTEXT_OFFSET;
+ handler, i.e. in %rdx. Unfortunately %rdx isn't preserved across
+ function calls so we can't use it. Fortunately the user context
+ is part of the signal frame and the unwound %rsp directly points
+ at it. */
+ return sp + X86_64_LINUX_UCONTEXT_SIGCONTEXT_OFFSET;
}