aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-08-19 12:07:45 +0100
committerPedro Alves <palves@redhat.com>2016-08-19 12:11:55 +0100
commitc8ef42eed100c2439e600e846caa7437da93ac17 (patch)
tree16eaa9a4f76860a0926bdac3828d122d49f82373
parent9c235a72a112c5656f17499c0c0d3ad73609833d (diff)
downloadgdb-c8ef42eed100c2439e600e846caa7437da93ac17.zip
gdb-c8ef42eed100c2439e600e846caa7437da93ac17.tar.gz
gdb-c8ef42eed100c2439e600e846caa7437da93ac17.tar.bz2
x32: Avoid unsigned long when installing fast tracepoint jump pads
We're casting through unsigned long to write a 64-bit immediate operand of movabs (the comment said movl, but that was incorrect). The problem is that unsigned long is 32-bit on x32, so we were writing fewer bytes than necessary. Fix this by using an 8 byte memcpy like in other similar places in the function. gdb/gdbserver/ChangeLog: 2016-08-19 Pedro Alves <palves@redhat.com> * linux-x86-low.c (amd64_install_fast_tracepoint_jump_pad): Fix comment. Use memcpy instead of casting through unsigned long.
-rw-r--r--gdb/gdbserver/ChangeLog5
-rw-r--r--gdb/gdbserver/linux-x86-low.c6
2 files changed, 8 insertions, 3 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index ed53648..f59d389 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,10 @@
2016-08-19 Pedro Alves <palves@redhat.com>
+ * linux-x86-low.c (amd64_install_fast_tracepoint_jump_pad): Fix
+ comment. Use memcpy instead of casting through unsigned long.
+
+2016-08-19 Pedro Alves <palves@redhat.com>
+
* linux-amd64-ipa.c (alloc_jump_pad_buffer) [__ILP32__]: Try
allocating around 0x80000000.
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index d6b67c1..1ba98ba 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -1092,10 +1092,10 @@ amd64_install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, CORE_ADDR tpaddr,
buf[i++] = 0x41; buf[i++] = 0x51; /* push %r9 */
buf[i++] = 0x41; buf[i++] = 0x50; /* push %r8 */
buf[i++] = 0x9c; /* pushfq */
- buf[i++] = 0x48; /* movl <addr>,%rdi */
+ buf[i++] = 0x48; /* movabs <addr>,%rdi */
buf[i++] = 0xbf;
- *((unsigned long *)(buf + i)) = (unsigned long) tpaddr;
- i += sizeof (unsigned long);
+ memcpy (buf + i, &tpaddr, 8);
+ i += 8;
buf[i++] = 0x57; /* push %rdi */
append_insns (&buildaddr, i, buf);