]> git.proxmox.com Git - mirror_qemu.git/commitdiff
Revert "virtio-pci: replace byte swap hack"
authorBlue Swirl <blauwirbel@gmail.com>
Sun, 6 Jan 2013 18:30:17 +0000 (18:30 +0000)
committerBlue Swirl <blauwirbel@gmail.com>
Sun, 6 Jan 2013 18:30:17 +0000 (18:30 +0000)
This reverts commit 9807caccd605d09a72495637959568d690e10175.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
exec.c
hw/virtio-pci.c

diff --git a/exec.c b/exec.c
index 140eb5668fc0caa4b9baeba611715207515e3d8a..a6923addd48c6d0252c3296f3b560a5fa41d52b4 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -2587,6 +2587,24 @@ int cpu_memory_rw_debug(CPUArchState *env, target_ulong addr,
 }
 #endif
 
+#if !defined(CONFIG_USER_ONLY)
+
+/*
+ * A helper function for the _utterly broken_ virtio device model to find out if
+ * it's running on a big endian machine. Don't do this at home kids!
+ */
+bool virtio_is_big_endian(void);
+bool virtio_is_big_endian(void)
+{
+#if defined(TARGET_WORDS_BIGENDIAN)
+    return true;
+#else
+    return false;
+#endif
+}
+
+#endif
+
 #ifndef CONFIG_USER_ONLY
 bool cpu_physical_memory_is_io(hwaddr phys_addr)
 {
index e714bcac72ec761add548fff58901bc2dfd94c4c..c7f0c4d4ed9ff0f42d3a3cc4918760d01422ec5b 100644 (file)
@@ -92,6 +92,9 @@
  */
 #define wmb() do { } while (0)
 
+/* HACK for virtio to determine if it's running a big endian guest */
+bool virtio_is_big_endian(void);
+
 /* virtio device */
 /* DeviceState to VirtIOPCIProxy. For use off data-path. TODO: use QOM. */
 static inline VirtIOPCIProxy *to_virtio_pci_proxy(DeviceState *d)
@@ -400,9 +403,15 @@ static uint64_t virtio_pci_config_read(void *opaque, hwaddr addr,
         break;
     case 2:
         val = virtio_config_readw(proxy->vdev, addr);
+        if (virtio_is_big_endian()) {
+            val = bswap16(val);
+        }
         break;
     case 4:
         val = virtio_config_readl(proxy->vdev, addr);
+        if (virtio_is_big_endian()) {
+            val = bswap32(val);
+        }
         break;
     }
     return val;
@@ -427,9 +436,15 @@ static void virtio_pci_config_write(void *opaque, hwaddr addr,
         virtio_config_writeb(proxy->vdev, addr, val);
         break;
     case 2:
+        if (virtio_is_big_endian()) {
+            val = bswap16(val);
+        }
         virtio_config_writew(proxy->vdev, addr, val);
         break;
     case 4:
+        if (virtio_is_big_endian()) {
+            val = bswap32(val);
+        }
         virtio_config_writel(proxy->vdev, addr, val);
         break;
     }
@@ -442,7 +457,7 @@ static const MemoryRegionOps virtio_pci_config_ops = {
         .min_access_size = 1,
         .max_access_size = 4,
     },
-    .endianness = DEVICE_NATIVE_ENDIAN,
+    .endianness = DEVICE_LITTLE_ENDIAN,
 };
 
 static void virtio_write_config(PCIDevice *pci_dev, uint32_t address,