summaryrefslogtreecommitdiff
path: root/gdb/amd64obsd-tdep.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2011-12-17 12:22:04 +0000
committerMark Kettenis <kettenis@gnu.org>2011-12-17 12:22:04 +0000
commitb86b60d045c3872f7a7ae6685b4a10875d324c13 (patch)
tree2a679c469bc3452cd36b75dc14b744fb5afe705a /gdb/amd64obsd-tdep.c
parent5ac9e9c92053c09fed3055c2c98d254b7f1d33cb (diff)
downloadgdb-b86b60d045c3872f7a7ae6685b4a10875d324c13.tar.gz
* amd64obsd-tdep.c (amd64obsd_sigtramp_p): Detect new signal
trampoline to be introduced in OpenBSD 5.0.
Diffstat (limited to 'gdb/amd64obsd-tdep.c')
-rw-r--r--gdb/amd64obsd-tdep.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gdb/amd64obsd-tdep.c b/gdb/amd64obsd-tdep.c
index 2ff5c8f9182..e66cd2b1794 100644
--- a/gdb/amd64obsd-tdep.c
+++ b/gdb/amd64obsd-tdep.c
@@ -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;