diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-07-03 14:53:56 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-07-03 14:53:56 +0000 |
commit | 1e55e04f56d3f1524afd83aa65d5bffdb3795dc7 (patch) | |
tree | 0d48531011f38e5da0bfbaee10ebec9213eeb84d /gdb/amd64-linux-tdep.c | |
parent | 90c984fc53ae23dcda0cba309ad4b51a9dd5d9ee (diff) | |
download | gdb-1e55e04f56d3f1524afd83aa65d5bffdb3795dc7.zip gdb-1e55e04f56d3f1524afd83aa65d5bffdb3795dc7.tar.gz gdb-1e55e04f56d3f1524afd83aa65d5bffdb3795dc7.tar.bz2 |
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.
Diffstat (limited to 'gdb/amd64-linux-tdep.c')
-rw-r--r-- | gdb/amd64-linux-tdep.c | 21 |
1 files changed, 18 insertions, 3 deletions
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; |