x32: Avoid unsigned long when installing fast tracepoint jump pads
authorPedro Alves <palves@redhat.com>
Fri, 19 Aug 2016 11:07:45 +0000 (12:07 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 19 Aug 2016 11:11:55 +0000 (12:11 +0100)
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.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-x86-low.c

index ed5364850c5e471a2b9340ed3b75b0e1263bd47f..f59d389db6e60432157be94069b60c25c99475bc 100644 (file)
@@ -1,3 +1,8 @@
+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
index d6b67c1b885537732cb6778cb1bca5e014613680..1ba98ba4e07a51ab1d57d13d542c51c24d7a6071 100644 (file)
@@ -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);