On 07/08/19 19:49, Richard Henderson wrote: > On 8/7/19 1:33 AM, tony.ngu...@bt.com wrote: >> @@ -551,6 +551,7 @@ void virtio_address_space_write(VirtIOPCIProxy *proxy, >> hwaddr addr, >> /* As length is under guest control, handle illegal values. */ >> return; >> } >> + /* FIXME: memory_region_dispatch_write ignores MO_BSWAP. */ >> memory_region_dispatch_write(mr, addr, val, size_memop(len), >> MEMTXATTRS_UNSPECIFIED); >> } > > Here is an example of where Paolo is quite right -- you cannot simply add > MO_TE > via size_memop(). In patch 22 we see > >> @@ -542,16 +542,15 @@ void virtio_address_space_write(VirtIOPCIProxy *proxy, >> hwaddr addr, >> val = pci_get_byte(buf); >> break; >> case 2: >> - val = cpu_to_le16(pci_get_word(buf)); >> + val = pci_get_word(buf); >> break; >> case 4: >> - val = cpu_to_le32(pci_get_long(buf)); >> + val = pci_get_long(buf); >> break; >> default: >> /* As length is under guest control, handle illegal values. */ >> return; >> } >> - /* FIXME: memory_region_dispatch_write ignores MO_BSWAP. */ >> memory_region_dispatch_write(mr, addr, val, size_memop(len), >> MEMTXATTRS_UNSPECIFIED); > > This is a little-endian store -- MO_LE not MO_TE.
Or leave the switch statement aside and request host endianness. Either is fine. Paolo