From 1e55e04f56d3f1524afd83aa65d5bffdb3795dc7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 3 Jul 2012 14:53:56 +0000 Subject: Support x32 sigtramp * amd64-linux-tdep.c (linux_sigtramp_code): Renamed to ... (amd64_linux_sigtramp_code): This. (amd64_x32_linux_sigtramp_code): New. (LINUX_SIGTRAMP_LEN): Updated. (amd64_linux_sigtramp_start): Check x32 sigtramp. --- gdb/ChangeLog | 8 ++++++++ gdb/amd64-linux-tdep.c | 21 ++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 52bc5ed..7ba59f4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2012-07-03 H.J. Lu + + * amd64-linux-tdep.c (linux_sigtramp_code): Renamed to ... + (amd64_linux_sigtramp_code): This. + (amd64_x32_linux_sigtramp_code): New. + (LINUX_SIGTRAMP_LEN): Updated. + (amd64_linux_sigtramp_start): Check x32 sigtramp. + 2012-07-02 Jan Kratochvil * linux-thread-db.c (thread_db_new_objfile): Fix comment typos. diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c index 0adc22b..d919216 100644 --- a/gdb/amd64-linux-tdep.c +++ b/gdb/amd64-linux-tdep.c @@ -107,7 +107,7 @@ int amd64_linux_gregset_reg_offset[] = #define LINUX_SIGTRAMP_INSN1 0x0f /* syscall */ #define LINUX_SIGTRAMP_OFFSET1 7 -static const gdb_byte linux_sigtramp_code[] = +static const gdb_byte amd64_linux_sigtramp_code[] = { /* mov $__NR_rt_sigreturn, %rax */ LINUX_SIGTRAMP_INSN0, 0xc7, 0xc0, 0x0f, 0x00, 0x00, 0x00, @@ -115,7 +115,15 @@ static const gdb_byte linux_sigtramp_code[] = LINUX_SIGTRAMP_INSN1, 0x05 }; -#define LINUX_SIGTRAMP_LEN (sizeof linux_sigtramp_code) +static const gdb_byte amd64_x32_linux_sigtramp_code[] = +{ + /* mov $__NR_rt_sigreturn, %rax. */ + LINUX_SIGTRAMP_INSN0, 0xc7, 0xc0, 0x01, 0x02, 0x00, 0x40, + /* syscall */ + LINUX_SIGTRAMP_INSN1, 0x05 +}; + +#define LINUX_SIGTRAMP_LEN (sizeof amd64_linux_sigtramp_code) /* If PC is in a sigtramp routine, return the address of the start of the routine. Otherwise, return 0. */ @@ -123,6 +131,8 @@ static const gdb_byte linux_sigtramp_code[] = static CORE_ADDR amd64_linux_sigtramp_start (struct frame_info *this_frame) { + struct gdbarch *gdbarch; + const gdb_byte *sigtramp_code; CORE_ADDR pc = get_frame_pc (this_frame); gdb_byte buf[LINUX_SIGTRAMP_LEN]; @@ -146,7 +156,12 @@ amd64_linux_sigtramp_start (struct frame_info *this_frame) return 0; } - if (memcmp (buf, linux_sigtramp_code, LINUX_SIGTRAMP_LEN) != 0) + gdbarch = get_frame_arch (this_frame); + if (gdbarch_ptr_bit (gdbarch) == 32) + sigtramp_code = amd64_x32_linux_sigtramp_code; + else + sigtramp_code = amd64_linux_sigtramp_code; + if (memcmp (buf, sigtramp_code, LINUX_SIGTRAMP_LEN) != 0) return 0; return pc; -- cgit v1.1