This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC PATCH] Fix decoding of superfluous data32 prefix before superfluous rex.W prefix before push.


On Fri, Aug 3, 2012 at 11:47 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, Aug 3, 2012 at 11:17 AM, Roland McGrath <mcgrathr@google.com> wrote:
>> x86-64 hardware ignores a superfluous data32 (0x66) prefix that precedes a
>> superfluous rex.W (0x48) prefix that precedes a push-immediate (0x68)
>> instruction.  But the disassembler gets confused by this:
>>
>>    0:   48 68 01 02 03 04       rex.W pushq $0x4030201
>>    6:   66 48 68 01 02          data32 pushq $0x201
>>    b:   03                      .byte 0x3
>>    c:   04                      .byte 0x4
>>
>> With this change it's at least not confused in the decoding:
>>
>>    0:   48 68 01 02 03 04       rex.W pushq $0x4030201
>>    6:   66 48 68 01 02 03 04    data32 pushq $0x4030201
>>
>> That's the most important thing, since it prevents it losing track of the
>> instruction boundaries.  But I'm not at all sure this is really the best
>> way to fix that.  The i386-dis.c code is extremely hairy and barely
>> commented.
>>
>> As of 2.20, it was not so confused and printed:
>>
>>    0:   66 48 68 01 02 03 04    pushq  $0x4030201
>>
>> So this is a regression of sorts.
>>
>> What would really be ideal is:
>>
>>    0:   48 68 01 02 03 04       rex.W pushq $0x4030201
>>    6:   66 48 68 01 02 03 04    data32 rex.W pushq $0x4030201
>>
>> i.e., print both superfluous prefixes rather than ignoring either.
>> But it's not at all clear to me how to make that happen.  I also really
>> have no idea what other cases might be affected by the same sort of problem.
>>
>> HJ, do you have any insight into all this?
>>
>
> Please also fix "pushq $-1" with a testcase:
>
> [hjl@gnu-6 tmp]$ cat p.s
> .text
> pushq $-1
> rex.W pushq $-1
> .byte 0x66
> rex.W pushq $-1
> [hjl@gnu-6 tmp]$ gcc -c p.s
> [hjl@gnu-6 tmp]$ objdump -dw p.o
>
> p.o:     file format elf64-x86-64
>
>
> Disassembly of section .text:
>
> 0000000000000000 <.text>:
>    0:   6a ff                   pushq  $0xffffffffffffffff
>    2:   48 6a ff                rex.W pushq $0xffffffffffffffff
>    5:   66 48 6a ff             data32 pushq $0xffff
> [hjl@gnu-6 tmp]$
>
> OK with this change.
>

Also the new testcases should be added to
x86-64-stack.s, not a new file.

Thanks.

-- 
H.J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]