On 06/12/15 18:38, Eric Blake wrote:
> On 06/12/2015 08:05 AM, Don Slutz wrote:
>> Before:
>>
>> commit c3c1bb99d1c11978d9ce94d1bdcf0705378c1459
>> Author: Peter Crosthwaite <[email protected]>
>> Date: Mon Mar 16 22:35:54 2015 -0700
>>
>> exec: Respect as_tranlsate_internal length clamp
>>
>> it did not matter. Only accept I/O that starts on 1st
>> port.
>>
>> Signed-off-by: Don Slutz <[email protected]>
>> CC: Don Slutz <[email protected]>
>> ---
>> hw/misc/vmport.c | 6 +++++-
>> 1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/hw/misc/vmport.c b/hw/misc/vmport.c
>> index 7fcc00d..51b64bc 100644
>> --- a/hw/misc/vmport.c
>> +++ b/hw/misc/vmport.c
>> @@ -69,6 +69,10 @@ static uint64_t vmport_ioport_read(void *opaque, hwaddr
>> addr,
>> unsigned char command;
>> uint32_t eax;
>>
>> + /* Only support 1 address */
>> + if (addr) {
>> + return ~0U;
>> + }
>
> Different answer on 32-bit platforms (there, ~0U is 0xffffffff, which
> then 0-extends to uint64_t rather than your desired result of
> 0xffffffffffffffffULL).
>
This is not true:
Using:
build1:~/tmp>cat zr64.c
#include <stdio.h>
#include <stdint.h>
uint64_t vmport_ioport_read(void)
{
return ~0U;
}
int
main(void)
{
uint64_t res = vmport_ioport_read();
printf("res=0x%llx\n", res);
}
On 32-bits:
build1:~/tmp>file zr64
zr64: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
build1:~/tmp>./zr64
res=0xffffffff
on 64-bits:
build2:~/tmp>file zr64
zr64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
build2:~/tmp>./zr64
res=0xffffffff
> Why can't you just 'return -1;'?
>
I/O instructions on x86 are limited to 32bits max. Also when EAX is
changed via inl, the high 32bits are 0. So the correct result is ~0U
not -1.
-Don Slutz