bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug binutils/32462] New: objdump incorrectly disassembles PAUSE with RE


From: michaeljclark at mac dot com
Subject: [Bug binutils/32462] New: objdump incorrectly disassembles PAUSE with REX.B prefix
Date: Sun, 15 Dec 2024 22:23:56 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=32462

            Bug ID: 32462
           Summary: objdump incorrectly disassembles PAUSE with REX.B
                    prefix
           Product: binutils
           Version: 2.42
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: binutils
          Assignee: unassigned at sourceware dot org
          Reporter: michaeljclark at mac dot com
  Target Milestone: ---

aka 'rep xchg r8d, eax' disassembles as 'rex.B pause'

# observations

- NOP 'nof3 norexb 90' is 'xchg eax, eax' under the hood.
- PAUSE is 'rep nop' under the hood.
- adding REX.B to NOP produces 'xchg r8d, eax' which is
  presumably why it is defined as 'nof3 norexb 90'.

there appears to be am issue when you add REX.B to PAUSE.
it is no longer PAUSE. logically it is 'rep xchg r8d, eax':

$ ./build/llvm_dump -x f3 90
    f3 90                   pause
$ ./scripts/binutils_dump.sh f3 90
    f3 90                   pause
$ ./build/llvm_dump -x f3 41 90
    f3 41 90                xchg    eax, r8d
$ ./scripts/binutils_dump.sh f3 41 90
    f3 41 90                rex.B pause

LLVM disassembles this almost correctly but it is missing
the rep prefix. objdump displays it as 'rex.B pause' which
seems bad as it presumably has architectural state changes.

I will test this out in QEMU and on real hardware but it
makes sense in light of PAUSE being an alias for 'rep nop'.
NOP has 'rorexb nof3 90' in its NASM metadata. so perhaps
this clash with REX.B may have been overlooked for PAUSE
because underneath it is an alias for 'rep xchg eax, eax'.

by the way, gas won't assemble 'rep xchg r8d, eax' likely,
because XCHG is not a string instruction. but the clang
assembler allows me to assemble it:

$ as --version | head -1
GNU assembler (GNU Binutils for Ubuntu) 2.42
$ clang --version | head -1
Ubuntu clang version 18.1.3 (1ubuntu1)
$ cat c.s 
.intel_syntax noprefix
rep xchg r8d, eax
$ as -o c.o c.s 
c.s: Assembler messages:
c.s:2: Error: invalid instruction `xchg' after `rep'
$ clang -c c.s
$ objdump -d c.o 
...
0000000000000000 <.text>:
   0:    f3 41 90                 rex.B pause

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]