aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2012-07-03 14:53:56 +0000
committerH.J. Lu <hjl.tools@gmail.com>2012-07-03 14:53:56 +0000
commit1e55e04f56d3f1524afd83aa65d5bffdb3795dc7 (patch)
tree0d48531011f38e5da0bfbaee10ebec9213eeb84d
parent90c984fc53ae23dcda0cba309ad4b51a9dd5d9ee (diff)
downloadgdb-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.
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/amd64-linux-tdep.c21
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 <hongjiu.lu@intel.com>
+
+ * 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 <jan.kratochvil@redhat.com>
* 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;