From: Borislav Petkov Date: Sat, 28 Nov 2020 13:20:06 +0000 (+0100) Subject: x86: Do not dump DS/CS segment overrides for branch hints X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=632ee6fd822f8264edc5935c4e31955849df8ba2;p=binutils-gdb.git x86: Do not dump DS/CS segment overrides for branch hints The previous change "x86: Ignore CS/DS/ES/SS segment-override prefixes in 64-bit mode" to ignore segment override prefixes in 64-bit mode lead to dumping branch hints as excessive prefixes: ffffffff8109d5a0 : ... ffffffff8109d601: 3e 77 0a ds ja,pt ffffffff8109d60e ^^^^^ In this particular case, those prefixes are not excessive but are used to provide branch hints - taken/not-taken - to the CPU. Assign active_seg_prefix in that particular case to consume them. gas/ 2002-11-29 Borislav Petkov * testsuite/gas/i386/branch.d: Add new branch insns test. * testsuite/gas/i386/branch.s: Likewise. * testsuite/gas/i386/i386.exp: Insert the new branch test. * testsuite/gas/i386/x86-64-branch.d: Test for branch hints insns. * testsuite/gas/i386/x86-64-branch.s: Likewise. * testsuite/gas/i386/ilp32/x86-64-branch.d: Likewise. opcodes/ 2020-11-28 Borislav Petkov * i386-dis.c (print_insn): Set active_seg_prefix for branch hint insns to not dump branch hint prefixes 0x2E and 0x3E as unused prefixes. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 97754267be9..8d07dc9bbb9 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2002-11-29 Borislav Petkov + + * testsuite/gas/i386/branch.d: Add new branch insns test. + * testsuite/gas/i386/branch.s: Likewise. + * testsuite/gas/i386/i386.exp: Insert the new branch test. + * testsuite/gas/i386/x86-64-branch.d: Test for branch hints insns. + * testsuite/gas/i386/x86-64-branch.s: Likewise. + * testsuite/gas/i386/ilp32/x86-64-branch.d: Likewise. + 2020-11-27 Jozef Lawrynowicz * testsuite/gas/elf/elf.exp: Run new tests. diff --git a/gas/testsuite/gas/i386/branch.d b/gas/testsuite/gas/i386/branch.d new file mode 100644 index 00000000000..6d25b950830 --- /dev/null +++ b/gas/testsuite/gas/i386/branch.d @@ -0,0 +1,12 @@ +#as: -J +#objdump: -dw +#name: i386 branch + +.*: +file format .* + +Disassembly of section .text: + +0+ <.text>: +[ ]*[a-f0-9]+: 3e 74 03[ ]+je,pt +0x[0-9a-f]+ +[ ]*[a-f0-9]+: 2e 74 00[ ]+je,pn +0x[0-9a-f]+ +#pass diff --git a/gas/testsuite/gas/i386/branch.s b/gas/testsuite/gas/i386/branch.s new file mode 100644 index 00000000000..968a1818970 --- /dev/null +++ b/gas/testsuite/gas/i386/branch.s @@ -0,0 +1,4 @@ +.text + jz,pt .Llabel + jz,pn .Llabel +.Llabel: diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index c85ced1c918..432cf0192d4 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -565,6 +565,7 @@ if [gas_32_check] then { run_dump_test "lfence-ret-c" run_dump_test "lfence-ret-d" run_dump_test "lfence-byte" + run_dump_test "branch" # These tests require support for 8 and 16 bit relocs, # so we only run them for ELF and COFF targets. diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-branch.d b/gas/testsuite/gas/i386/ilp32/x86-64-branch.d index 8be91de922f..d5f2358546f 100644 --- a/gas/testsuite/gas/i386/ilp32/x86-64-branch.d +++ b/gas/testsuite/gas/i386/ilp32/x86-64-branch.d @@ -25,6 +25,8 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 66 0f 82 00 00 00 00 data16 jb 0x37 33: R_X86_64_PLT32 foo-0x4 [ ]*[a-f0-9]+: 66 c3 data16 ret * [ ]*[a-f0-9]+: 66 c2 08 00 data16 ret \$0x8 +[ ]*[a-f0-9]+: 3e 74 03[ ]+je,pt +0x[0-9a-f]+ +[ ]*[a-f0-9]+: 2e 74 00[ ]+je,pn +0x[0-9a-f]+ [ ]*[a-f0-9]+: ff d0 call \*%rax [ ]*[a-f0-9]+: ff d0 call \*%rax [ ]*[a-f0-9]+: 66 ff d0 data16 call \*%rax diff --git a/gas/testsuite/gas/i386/x86-64-branch.d b/gas/testsuite/gas/i386/x86-64-branch.d index 2618134b401..b963f9f051e 100644 --- a/gas/testsuite/gas/i386/x86-64-branch.d +++ b/gas/testsuite/gas/i386/x86-64-branch.d @@ -24,6 +24,8 @@ Disassembly of section .text: [ ]*[a-f0-9]+: 66 0f 82 00 00 00 00 data16 jb (0x37|37 <.text\+0x37>) [ ]*[a-f0-9]+: 66 c3 data16 ret * [ ]*[a-f0-9]+: 66 c2 08 00 data16 ret \$0x8 +[ ]*[a-f0-9]+: 3e 74 03[ ]+je,pt +0x[0-9a-f]+ +[ ]*[a-f0-9]+: 2e 74 00[ ]+je,pn +0x[0-9a-f]+ [ ]*[a-f0-9]+: ff d0 call \*%rax [ ]*[a-f0-9]+: ff d0 call \*%rax [ ]*[a-f0-9]+: 66 ff d0 data16 call \*%rax diff --git a/gas/testsuite/gas/i386/x86-64-branch.s b/gas/testsuite/gas/i386/x86-64-branch.s index eb40dd4d4cd..496e1bb089f 100644 --- a/gas/testsuite/gas/i386/x86-64-branch.s +++ b/gas/testsuite/gas/i386/x86-64-branch.s @@ -22,6 +22,10 @@ retw retw $8 + jz,pt .Llabel + jz,pn .Llabel +.Llabel: + .intel_syntax noprefix call rax callq rax diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 1e7e40fd966..02fd2f5b583 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2020-11-28 Borislav Petkov + + * i386-dis.c (print_insn): Set active_seg_prefix for branch hint insns + to not dump branch hint prefixes 0x2E and 0x3E as unused prefixes. + 2020-11-16 Przemyslaw Wirkus * aarch64-tbl.h (FLAGM): Handle for FLAGM feature. diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 58cf001080b..a1e47c57251 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -10910,10 +10910,19 @@ putop (const char *in_template, int sizeflag) used_prefixes |= prefixes & (PREFIX_CS | PREFIX_DS); *obufp++ = ','; *obufp++ = 'p'; + + /* Set active_seg_prefix even if not set in 64-bit mode + because here it is a valid branch hint. */ if (prefixes & PREFIX_DS) - *obufp++ = 't'; + { + active_seg_prefix = PREFIX_DS; + *obufp++ = 't'; + } else - *obufp++ = 'n'; + { + active_seg_prefix = PREFIX_CS; + *obufp++ = 'n'; + } } break; case 'K':