* [Qemu-devel] [PULL 0/2] VFIO endian updates @ 2014-09-23 17:14 Alex Williamson 2014-09-23 17:14 ` [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" Alex Williamson ` (2 more replies) 0 siblings, 3 replies; 6+ messages in thread From: Alex Williamson @ 2014-09-23 17:14 UTC (permalink / raw) To: qemu-devel; +Cc: alex.williamson The following changes since commit 07e2863d0271ac6c05206d8ce9e4f4c39b25d3ea: exec.c: fix setting 1-byte-long watchpoints (2014-09-19 17:42:16 +0100) are available in the git repository at: git://github.com/awilliam/qemu-vfio.git tags/vfio-pci-for-qemu-20140923.0 for you to fetch changes up to 75bd0c7253f384e868b638db5c6350796cf584f7: vfio: make rom read endian sensitive (2014-09-22 15:27:43 -0600) ---------------------------------------------------------------- Endian updates to re-fix cross endian host and guest and enable the same for ROM loading (Alexey) ---------------------------------------------------------------- Alexey Kardashevskiy (1): Revert "vfio: Make BARs native endian" Nikunj A Dadhania (1): vfio: make rom read endian sensitive hw/misc/vfio.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" 2014-09-23 17:14 [Qemu-devel] [PULL 0/2] VFIO endian updates Alex Williamson @ 2014-09-23 17:14 ` Alex Williamson 2014-09-24 0:55 ` David Gibson 2014-09-23 17:14 ` [Qemu-devel] [PULL 2/2] vfio: make rom read endian sensitive Alex Williamson 2014-09-24 11:50 ` [Qemu-devel] [PULL 0/2] VFIO endian updates Peter Maydell 2 siblings, 1 reply; 6+ messages in thread From: Alex Williamson @ 2014-09-23 17:14 UTC (permalink / raw) To: qemu-devel; +Cc: Alexey Kardashevskiy, alex.williamson From: Alexey Kardashevskiy <aik@ozlabs.ru> This reverts commit c40708176a6b52b73bec14796b7c71b882ceb102. The resulting code wrongly assumed target and host endianness are the same which is not always the case for PPC64. [aw: or potentially any host supporting VFIO and TCG] Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> --- hw/misc/vfio.c | 41 ++++++++++------------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c index 40dcaa6..22ebcbd 100644 --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -1098,10 +1098,10 @@ static void vfio_bar_write(void *opaque, hwaddr addr, buf.byte = data; break; case 2: - buf.word = data; + buf.word = cpu_to_le16(data); break; case 4: - buf.dword = data; + buf.dword = cpu_to_le32(data); break; default: hw_error("vfio: unsupported write size, %d bytes", size); @@ -1158,10 +1158,10 @@ static uint64_t vfio_bar_read(void *opaque, data = buf.byte; break; case 2: - data = buf.word; + data = le16_to_cpu(buf.word); break; case 4: - data = buf.dword; + data = le32_to_cpu(buf.dword); break; default: hw_error("vfio: unsupported read size, %d bytes", size); @@ -1188,7 +1188,7 @@ static uint64_t vfio_bar_read(void *opaque, static const MemoryRegionOps vfio_bar_ops = { .read = vfio_bar_read, .write = vfio_bar_write, - .endianness = DEVICE_NATIVE_ENDIAN, + .endianness = DEVICE_LITTLE_ENDIAN, }; static void vfio_pci_load_rom(VFIODevice *vdev) @@ -1250,42 +1250,21 @@ static void vfio_pci_load_rom(VFIODevice *vdev) static uint64_t vfio_rom_read(void *opaque, hwaddr addr, unsigned size) { VFIODevice *vdev = opaque; - union { - uint8_t byte; - uint16_t word; - uint32_t dword; - uint64_t qword; - } buf; - uint64_t data = 0; + uint64_t val = ((uint64_t)1 << (size * 8)) - 1; /* Load the ROM lazily when the guest tries to read it */ if (unlikely(!vdev->rom && !vdev->rom_read_failed)) { vfio_pci_load_rom(vdev); } - memcpy(&buf, vdev->rom + addr, + memcpy(&val, vdev->rom + addr, (addr < vdev->rom_size) ? MIN(size, vdev->rom_size - addr) : 0); - switch (size) { - case 1: - data = buf.byte; - break; - case 2: - data = buf.word; - break; - case 4: - data = buf.dword; - break; - default: - hw_error("vfio: unsupported read size, %d bytes", size); - break; - } - DPRINTF("%s(%04x:%02x:%02x.%x, 0x%"HWADDR_PRIx", 0x%x) = 0x%"PRIx64"\n", __func__, vdev->host.domain, vdev->host.bus, vdev->host.slot, - vdev->host.function, addr, size, data); + vdev->host.function, addr, size, val); - return data; + return val; } static void vfio_rom_write(void *opaque, hwaddr addr, @@ -1296,7 +1275,7 @@ static void vfio_rom_write(void *opaque, hwaddr addr, static const MemoryRegionOps vfio_rom_ops = { .read = vfio_rom_read, .write = vfio_rom_write, - .endianness = DEVICE_NATIVE_ENDIAN, + .endianness = DEVICE_LITTLE_ENDIAN, }; static bool vfio_blacklist_opt_rom(VFIODevice *vdev) ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" 2014-09-23 17:14 ` [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" Alex Williamson @ 2014-09-24 0:55 ` David Gibson 0 siblings, 0 replies; 6+ messages in thread From: David Gibson @ 2014-09-24 0:55 UTC (permalink / raw) To: Alex Williamson; +Cc: Alexey Kardashevskiy, qemu-devel [-- Attachment #1: Type: text/plain, Size: 744 bytes --] On Tue, Sep 23, 2014 at 11:14:50AM -0600, Alex Williamson wrote: > From: Alexey Kardashevskiy <aik@ozlabs.ru> > > This reverts commit c40708176a6b52b73bec14796b7c71b882ceb102. > > The resulting code wrongly assumed target and host endianness are > the same which is not always the case for PPC64. > > [aw: or potentially any host supporting VFIO and TCG] > > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson [-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PULL 2/2] vfio: make rom read endian sensitive 2014-09-23 17:14 [Qemu-devel] [PULL 0/2] VFIO endian updates Alex Williamson 2014-09-23 17:14 ` [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" Alex Williamson @ 2014-09-23 17:14 ` Alex Williamson 2014-09-24 0:56 ` David Gibson 2014-09-24 11:50 ` [Qemu-devel] [PULL 0/2] VFIO endian updates Peter Maydell 2 siblings, 1 reply; 6+ messages in thread From: Alex Williamson @ 2014-09-23 17:14 UTC (permalink / raw) To: qemu-devel; +Cc: Alexey Kardashevskiy, alex.williamson, Nikunj A Dadhania From: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> All memory regions used by VFIO are LITTLE_ENDIAN and they already take care of endiannes when accessing real device BARs except ROM - it was broken on BE hosts. This fixes endiannes for ROM BARs the same way as it is done for other BARs. This has been tested on PPC64 BE/LE host/guest in all possible combinations including TCG. Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> [aik: added commit log] Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Alex Williamson <alex.williamson@redhat.com> --- hw/misc/vfio.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/hw/misc/vfio.c b/hw/misc/vfio.c index 22ebcbd..d66f3d2 100644 --- a/hw/misc/vfio.c +++ b/hw/misc/vfio.c @@ -1250,7 +1250,13 @@ static void vfio_pci_load_rom(VFIODevice *vdev) static uint64_t vfio_rom_read(void *opaque, hwaddr addr, unsigned size) { VFIODevice *vdev = opaque; - uint64_t val = ((uint64_t)1 << (size * 8)) - 1; + union { + uint8_t byte; + uint16_t word; + uint32_t dword; + uint64_t qword; + } val; + uint64_t data = 0; /* Load the ROM lazily when the guest tries to read it */ if (unlikely(!vdev->rom && !vdev->rom_read_failed)) { @@ -1260,11 +1266,26 @@ static uint64_t vfio_rom_read(void *opaque, hwaddr addr, unsigned size) memcpy(&val, vdev->rom + addr, (addr < vdev->rom_size) ? MIN(size, vdev->rom_size - addr) : 0); + switch (size) { + case 1: + data = val.byte; + break; + case 2: + data = le16_to_cpu(val.word); + break; + case 4: + data = le32_to_cpu(val.dword); + break; + default: + hw_error("vfio: unsupported read size, %d bytes\n", size); + break; + } + DPRINTF("%s(%04x:%02x:%02x.%x, 0x%"HWADDR_PRIx", 0x%x) = 0x%"PRIx64"\n", __func__, vdev->host.domain, vdev->host.bus, vdev->host.slot, - vdev->host.function, addr, size, val); + vdev->host.function, addr, size, data); - return val; + return data; } static void vfio_rom_write(void *opaque, hwaddr addr, ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PULL 2/2] vfio: make rom read endian sensitive 2014-09-23 17:14 ` [Qemu-devel] [PULL 2/2] vfio: make rom read endian sensitive Alex Williamson @ 2014-09-24 0:56 ` David Gibson 0 siblings, 0 replies; 6+ messages in thread From: David Gibson @ 2014-09-24 0:56 UTC (permalink / raw) To: Alex Williamson; +Cc: Alexey Kardashevskiy, qemu-devel, Nikunj A Dadhania [-- Attachment #1: Type: text/plain, Size: 952 bytes --] On Tue, Sep 23, 2014 at 11:14:57AM -0600, Alex Williamson wrote: > From: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> > > All memory regions used by VFIO are LITTLE_ENDIAN and they > already take care of endiannes when accessing real device BARs > except ROM - it was broken on BE hosts. > > This fixes endiannes for ROM BARs the same way as it is done > for other BARs. > > This has been tested on PPC64 BE/LE host/guest in all possible > combinations including TCG. > > Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> > [aik: added commit log] > Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> > Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson [-- Attachment #2: Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PULL 0/2] VFIO endian updates 2014-09-23 17:14 [Qemu-devel] [PULL 0/2] VFIO endian updates Alex Williamson 2014-09-23 17:14 ` [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" Alex Williamson 2014-09-23 17:14 ` [Qemu-devel] [PULL 2/2] vfio: make rom read endian sensitive Alex Williamson @ 2014-09-24 11:50 ` Peter Maydell 2 siblings, 0 replies; 6+ messages in thread From: Peter Maydell @ 2014-09-24 11:50 UTC (permalink / raw) To: Alex Williamson; +Cc: QEMU Developers On 23 September 2014 10:14, Alex Williamson <alex.williamson@redhat.com> wrote: > The following changes since commit 07e2863d0271ac6c05206d8ce9e4f4c39b25d3ea: > > exec.c: fix setting 1-byte-long watchpoints (2014-09-19 17:42:16 +0100) > > are available in the git repository at: > > git://github.com/awilliam/qemu-vfio.git tags/vfio-pci-for-qemu-20140923.0 > > for you to fetch changes up to 75bd0c7253f384e868b638db5c6350796cf584f7: > > vfio: make rom read endian sensitive (2014-09-22 15:27:43 -0600) > > ---------------------------------------------------------------- > Endian updates to re-fix cross endian host and guest and > enable the same for ROM loading (Alexey) > > ---------------------------------------------------------------- > Alexey Kardashevskiy (1): > Revert "vfio: Make BARs native endian" > > Nikunj A Dadhania (1): > vfio: make rom read endian sensitive > > hw/misc/vfio.c | 24 ++++++++++++------------ > 1 file changed, 12 insertions(+), 12 deletions(-) Applied, thanks. -- PMM ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-09-24 11:51 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-09-23 17:14 [Qemu-devel] [PULL 0/2] VFIO endian updates Alex Williamson 2014-09-23 17:14 ` [Qemu-devel] [PULL 1/2] Revert "vfio: Make BARs native endian" Alex Williamson 2014-09-24 0:55 ` David Gibson 2014-09-23 17:14 ` [Qemu-devel] [PULL 2/2] vfio: make rom read endian sensitive Alex Williamson 2014-09-24 0:56 ` David Gibson 2014-09-24 11:50 ` [Qemu-devel] [PULL 0/2] VFIO endian updates Peter Maydell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).