Re: x86emu emulation problem

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

 



jf simon wrote:

> Hi,
>
>>> 2- The same code as seen from ndisasm:
>>>
>>> 000068DA  A00080            mov al,[0x8000]
>>> 000068DD  04F5              add al,0xf5
>>> 000068DF  0002              add [bp+si],al
>>> 000068E1  C8008015          enter 0x8000,0x15
>>> 000068E5  0E                push cs
>>> 000068E6  0106C800          add [0xc8],ax
>>> 000068EA  80100E            adc byte [bx+si],0xe
>>> 000068ED  0105              add [di],ax
>>> 000068EF  C800800B          enter 0x8000,0xb
>>> 000068F3  0E                push cs
>>> 000068F4  0104              add [si],ax
>>> 000068F6  C8008006          enter 0x8000,0x6
>>> 000068FA  0E                push cs
>>> 000068FB  0102              add [bp+si],ax
>>> 000068FD  E80080            call 0xe900       <<<<<!!!HERE AGAIN
>>>   
>>
>>
>>
>> This is probably data -- either font data or VGA register tables.  Can
>> you trace backwards any more and figure out how you got to 68DA?
>>
>>  
>>
> You are right. I have found that the problem was on  a JMP SHORT which
> was incorrectly landing in that part of the VGA BIOS. The relative
> displacement was negative (was 0xBA), but  the JMP was considering it
> to be a jump to [PC]+0xBA rather than applying the signed arithmetic.
> Setting  GCC  "-fsigned-char " switch made the signed displacemnt
> correctly applied....and solved the problem. I didn't know that the
> "char" type was unsigned by default.
>
> On a different issue, I think that the emulator may be wrong as it
> sometimes fetches values  from the DATA segment, even if the CS was
> previously selected as the source segment. For exemple,  in
> x86emu/ops.c, see [*]:
>
>
>           if (M.x86.mode & SYSMODE_PREFIX_DATA) {
>                u32 destval,srcval;
>
>                DECODE_PRINTF("TEST\tDWORD PTR ");
>                destoffset = decode_rm00_address(rl);
>                DECODE_PRINTF(",");
>                srcval = fetch_long_imm();
>                DECODE_PRINTF2("%x\n", srcval);
>                destval = fetch_data_long(destoffset);
>                TRACE_AND_STEP();
>                test_long(destval, srcval);
>            } else {
>                u16 destval,srcval;
>                DECODE_PRINTF("TEST\tWORD PTR ");
>                destoffset = decode_rm00_address(rl);
>                DECODE_PRINTF(",");
>                srcval = fetch_word_imm();
>                DECODE_PRINTF2("%x\n", srcval);
>                destval = fetch_data_word(destoffset);   [*]
>                TRACE_AND_STEP();
>                test_word(destval, srcval);
>            }
>
> [*] : shouldn't that be a fetch from the CS segt, since the mode (in
> M.x86.mode) is not of the DATA type?


No.  When they say SYSMODE_PREFIX_DATA, they are talking about the 0x66
prefix, which Intel calls the "operand size override".  That determines
whether the instruction uses 16-bit units or 32-bit units.  Compare with
SYSMODE_PREFIX_ADDR, the 0x67 prefix, which Intel calls "address size
override", which determines whether the addresses are 16-bit or 32-bits
wide.

The fetch_data_long and fetch_data_word functions will use the segment
overrides to decide which segment register to use.

-- 
Tim Roberts, timr@xxxxxxxxx
Providenza & Boekelheide, Inc.

_______________________________________________
Devel mailing list
Devel@xxxxxxxxxxx
http://XFree86.Org/mailman/listinfo/devel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [X Forum]     [XFree86]     [XFree86 Newbie]     [X.Org]     [IETF Annouce]     [Security]     [Fontconfig]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]

  Powered by Linux