qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [BUGFIX][PATCH v7 1/9] vmport: The io memory region nee


From: Don Slutz
Subject: Re: [Qemu-devel] [BUGFIX][PATCH v7 1/9] vmport: The io memory region needs to be at least a size of 4
Date: Mon, 15 Jun 2015 09:53:23 -0400
User-agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

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 <address@hidden>
>> 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 <address@hidden>
>> CC: Don Slutz <address@hidden>
>> ---
>>  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



reply via email to

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