2018-01-01 12:43:02 +08:00
|
|
|
/* Copyright 2009-2018 Free Software Foundation, Inc.
|
Fix displaced-stepping RIP-relative VEX-encoded instructions (AVX) (PR gdb/22499)
PR gdb/22499 is about a latent bug exposed by the switch to "maint set
target-non-stop on" by default on x86-64 GNU/Linux, a while ago. With
that on, GDB is also preferring to use displaced-stepping by default.
The testcase in the bug is failing because GDB ends up incorrectly
displaced-stepping over a RIP-relative VEX-encoded instruction, like
this:
0x00000000004007f5 <+15>: c5 fb 10 05 8b 01 00 00 vmovsd 0x18b(%rip),%xmm0 # 0x400988
While RIP-relative instructions need adjustment when relocated to the
scratch pad, GDB ends up just copying VEX-encoded instructions to the
scratch pad unmodified, with the end result that the inferior ends up
executing an instruction that fetches/writes memory from the wrong
address...
This patch teaches GDB about the VEX-encoding prefixes, fixing the
problem, and adds a testcase that fails without the GDB fix.
I think we may need a similar treatment for EVEX-encoded instructions,
but I didn't address that simply because I couldn't find any
EVEX-encoded RIP-relative instruction in the gas testsuite. In any
case, this commit is forward progress as-is already.
gdb/ChangeLog:
2017-12-04 Pedro Alves <palves@redhat.com>
PR gdb/22499
* amd64-tdep.c (amd64_insn::rex_offset): Rename to...
(amd64_insn::enc_prefix_offset): ... this, and tweak comment.
(vex2_prefix_p, vex3_prefix_p): New functions.
(amd64_get_insn_details): Adjust to rename. Also skip VEX2 and
VEX3 prefixes.
(fixup_riprel): Set VEX3.!B.
gdb/testsuite/ChangeLog:
2017-12-04 Pedro Alves <palves@redhat.com>
PR gdb/22499
* gdb.arch/amd64-disp-step-avx.S: New file.
* gdb.arch/amd64-disp-step-avx.exp: New file.
2017-12-04 23:59:20 +08:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
This file is part of the gdb testsuite.
|
|
|
|
|
|
|
|
Test displaced stepping over VEX-encoded RIP-relative AVX
|
|
|
|
instructions. */
|
|
|
|
|
|
|
|
.text
|
|
|
|
|
|
|
|
.global main
|
|
|
|
main:
|
|
|
|
nop
|
|
|
|
|
|
|
|
/***********************************************/
|
|
|
|
|
|
|
|
/* Test a VEX2-encoded RIP-relative instruction. */
|
|
|
|
|
|
|
|
.global test_rip_vex2
|
|
|
|
test_rip_vex2:
|
|
|
|
vmovsd ro_var(%rip),%xmm0
|
|
|
|
.global test_rip_vex2
|
|
|
|
test_rip_vex2_end:
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* Test a VEX3-encoded RIP-relative instruction. */
|
|
|
|
|
|
|
|
.global test_rip_vex3
|
|
|
|
test_rip_vex3:
|
|
|
|
vextractf128 $0x0,%ymm0,var128(%rip)
|
|
|
|
.global test_rip_vex3
|
|
|
|
test_rip_vex3_end:
|
|
|
|
nop
|
|
|
|
|
|
|
|
/* skip over test data */
|
|
|
|
jmp done
|
|
|
|
|
|
|
|
/* RIP-relative ro-data for VEX2 test above. */
|
|
|
|
|
|
|
|
ro_var:
|
|
|
|
.8byte 0x1122334455667788
|
|
|
|
.8byte 0x8877665544332211
|
|
|
|
|
|
|
|
/***********************************************/
|
|
|
|
|
|
|
|
/* All done. */
|
|
|
|
|
|
|
|
done:
|
|
|
|
mov $0,%rdi
|
|
|
|
call exit
|
|
|
|
hlt
|
|
|
|
|
|
|
|
/* RIP-relative data for VEX3 test above. */
|
|
|
|
|
|
|
|
.data
|
|
|
|
var128:
|
|
|
|
.8byte 0xaa55aa55aa55aa55
|
|
|
|
.8byte 0x55aa55aa55aa55aa
|