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 <peter.crosthwa...@xilinx.com> >> 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 <dsl...@verizon.com> >> CC: Don Slutz <don.sl...@gmail.com> >> --- >> 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