@@ -85,20 +85,6 @@ struct VirtQueue
EventNotifier host_notifier;
};
-#ifdef TARGET_VIRTIO_SWAPENDIAN
-bool virtio_byteswap;
-
-/* Ask target code if we should swap endian for all vring and config access. */
-static void mark_endian(void)
-{
- virtio_byteswap = virtio_swap_endian();
-}
-#else
-static void mark_endian(void)
-{
-}
-#endif
-
/* virt queue functions */
static void virtqueue_init(VirtQueue *vq)
{
@@ -540,9 +526,6 @@ void virtio_set_status(VirtIODevice *vdev, uint8_t val)
VirtioDeviceClass *k = VIRTIO_DEVICE_GET_CLASS(vdev);
trace_virtio_set_status(vdev, val);
- /* If guest virtio endian is uncertain, set it now. */
- mark_endian();
-
if (k->set_status) {
k->set_status(vdev, val);
}
@@ -13,18 +13,9 @@
#ifndef _QEMU_VIRTIO_ACCESS_H
#define _QEMU_VIRTIO_ACCESS_H
-#ifdef TARGET_VIRTIO_SWAPENDIAN
-/* Architectures which need biendian define this function. */
-extern bool virtio_swap_endian(void);
-
-extern bool virtio_byteswap;
-#else
-#define virtio_byteswap false
-#endif
-
static inline uint16_t virtio_lduw_phys(hwaddr pa)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap16(lduw_phys(pa));
}
return lduw_phys(pa);
@@ -33,7 +24,7 @@ static inline uint16_t virtio_lduw_phys(hwaddr pa)
static inline uint32_t virtio_ldl_phys(hwaddr pa)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap32(ldl_phys(pa));
}
return ldl_phys(pa);
@@ -41,7 +32,7 @@ static inline uint32_t virtio_ldl_phys(hwaddr pa)
static inline uint64_t virtio_ldq_phys(hwaddr pa)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap64(ldq_phys(pa));
}
return ldq_phys(pa);
@@ -49,7 +40,7 @@ static inline uint64_t virtio_ldq_phys(hwaddr pa)
static inline void virtio_stw_phys(hwaddr pa, uint16_t value)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
stw_phys(pa, bswap16(value));
} else {
stw_phys(pa, value);
@@ -58,7 +49,7 @@ static inline void virtio_stw_phys(hwaddr pa, uint16_t value)
static inline void virtio_stl_phys(hwaddr pa, uint32_t value)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
stl_phys(pa, bswap32(value));
} else {
stl_phys(pa, value);
@@ -67,7 +58,7 @@ static inline void virtio_stl_phys(hwaddr pa, uint32_t value)
static inline void virtio_stw_p(void *ptr, uint16_t v)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
stw_p(ptr, bswap16(v));
} else {
stw_p(ptr, v);
@@ -76,7 +67,7 @@ static inline void virtio_stw_p(void *ptr, uint16_t v)
static inline void virtio_stl_p(void *ptr, uint32_t v)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
stl_p(ptr, bswap32(v));
} else {
stl_p(ptr, v);
@@ -85,7 +76,7 @@ static inline void virtio_stl_p(void *ptr, uint32_t v)
static inline void virtio_stq_p(void *ptr, uint64_t v)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
stq_p(ptr, bswap64(v));
} else {
stq_p(ptr, v);
@@ -94,7 +85,7 @@ static inline void virtio_stq_p(void *ptr, uint64_t v)
static inline int virtio_lduw_p(const void *ptr)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap16(lduw_p(ptr));
} else {
return lduw_p(ptr);
@@ -103,7 +94,7 @@ static inline int virtio_lduw_p(const void *ptr)
static inline int virtio_ldl_p(const void *ptr)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap32(ldl_p(ptr));
} else {
return ldl_p(ptr);
@@ -112,7 +103,7 @@ static inline int virtio_ldl_p(const void *ptr)
static inline uint64_t virtio_ldq_p(const void *ptr)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap64(ldq_p(ptr));
} else {
return ldq_p(ptr);
@@ -121,7 +112,7 @@ static inline uint64_t virtio_ldq_p(const void *ptr)
static inline uint32_t virtio_tswap32(uint32_t s)
{
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
return bswap32(tswap32(s));
} else {
return tswap32(s);
@@ -131,7 +122,7 @@ static inline uint32_t virtio_tswap32(uint32_t s)
static inline void virtio_tswap32s(uint32_t *s)
{
tswap32s(s);
- if (virtio_byteswap) {
+ if (cpu_get_byteswap()) {
*s = bswap32(*s);
}
}
@@ -357,4 +357,11 @@ void cpu_reset_interrupt(CPUState *cpu, int mask);
*/
void cpu_resume(CPUState *cpu);
+/**
+ * cpu_get_byteswap:
+ *
+ * Is (any) CPU running in byteswapped mode. Normally false.
+ */
+bool cpu_get_byteswap(void);
+
#endif
@@ -25,3 +25,4 @@ stub-obj-y += vm-stop.o
stub-obj-y += vmstate.o
stub-obj-$(CONFIG_WIN32) += fd-register.o
stub-obj-y += cpus.o
+stub-obj-y += cpu_byteswap.o
@@ -118,9 +118,7 @@ void ppc_store_msr(CPUPPCState *env, target_ulong value)
hreg_store_msr(env, value, 0);
}
-/* Our virtio accesses are LE if the first CPU is LE when they touch
- * it. We assume endian doesn't change after that! */
-bool virtio_swap_endian(void)
+bool cpu_get_byteswap(void)
{
return first_cpu->hflags & (1 << MSR_LE);
}