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.
This commit is contained in:
parent
9c235a72a1
commit
c8ef42eed1
2 changed files with 8 additions and 3 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue