1
commit 1104c4b774c263da3d9f6e463d20bbc096e72b00
2
Author: aurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>
3
Date: Thu Mar 13 19:17:40 2008 +0000
5
rtl8139: fix endianness on big endian targets
7
On big endian targets with mmio accesses, the values are not always
8
swapped, depending on the accessed register. The Linux 8139too module
9
was able to cope with that, but not the 8139cp one.
12
git-svn-id: svn+ssh://svn.savannah.nongnu.org/qemu/trunk@4045 c046a42c-6fe2-441c-8c8c-71466251a162
14
Index: qemu-0.9.1/hw/rtl8139.c
15
===================================================================
16
--- qemu-0.9.1.orig/hw/rtl8139.c 2008-01-06 20:38:42.000000000 +0100
17
+++ qemu-0.9.1/hw/rtl8139.c 2008-04-14 11:26:14.000000000 +0200
18
@@ -2735,13 +2735,8 @@
20
DEBUG_PRINT(("RTL8139: ioport write(w) addr=0x%x val=0x%04x via write(b)\n", addr, val));
22
-#ifdef TARGET_WORDS_BIGENDIAN
23
- rtl8139_io_writeb(opaque, addr, (val >> 8) & 0xff);
24
- rtl8139_io_writeb(opaque, addr + 1, val & 0xff);
26
rtl8139_io_writeb(opaque, addr, val & 0xff);
27
rtl8139_io_writeb(opaque, addr + 1, (val >> 8) & 0xff);
32
@@ -2802,17 +2797,10 @@
35
DEBUG_PRINT(("RTL8139: ioport write(l) addr=0x%x val=0x%08x via write(b)\n", addr, val));
36
-#ifdef TARGET_WORDS_BIGENDIAN
37
- rtl8139_io_writeb(opaque, addr, (val >> 24) & 0xff);
38
- rtl8139_io_writeb(opaque, addr + 1, (val >> 16) & 0xff);
39
- rtl8139_io_writeb(opaque, addr + 2, (val >> 8) & 0xff);
40
- rtl8139_io_writeb(opaque, addr + 3, val & 0xff);
42
rtl8139_io_writeb(opaque, addr, val & 0xff);
43
rtl8139_io_writeb(opaque, addr + 1, (val >> 8) & 0xff);
44
rtl8139_io_writeb(opaque, addr + 2, (val >> 16) & 0xff);
45
rtl8139_io_writeb(opaque, addr + 3, (val >> 24) & 0xff);
50
@@ -2958,13 +2946,8 @@
52
DEBUG_PRINT(("RTL8139: ioport read(w) addr=0x%x via read(b)\n", addr));
54
-#ifdef TARGET_WORDS_BIGENDIAN
55
- ret = rtl8139_io_readb(opaque, addr) << 8;
56
- ret |= rtl8139_io_readb(opaque, addr + 1);
58
ret = rtl8139_io_readb(opaque, addr);
59
ret |= rtl8139_io_readb(opaque, addr + 1) << 8;
62
DEBUG_PRINT(("RTL8139: ioport read(w) addr=0x%x val=0x%04x\n", addr, ret));
64
@@ -3031,17 +3014,10 @@
66
DEBUG_PRINT(("RTL8139: ioport read(l) addr=0x%x via read(b)\n", addr));
68
-#ifdef TARGET_WORDS_BIGENDIAN
69
- ret = rtl8139_io_readb(opaque, addr) << 24;
70
- ret |= rtl8139_io_readb(opaque, addr + 1) << 16;
71
- ret |= rtl8139_io_readb(opaque, addr + 2) << 8;
72
- ret |= rtl8139_io_readb(opaque, addr + 3);
74
ret = rtl8139_io_readb(opaque, addr);
75
ret |= rtl8139_io_readb(opaque, addr + 1) << 8;
76
ret |= rtl8139_io_readb(opaque, addr + 2) << 16;
77
ret |= rtl8139_io_readb(opaque, addr + 3) << 24;
80
DEBUG_PRINT(("RTL8139: read(l) addr=0x%x val=%08x\n", addr, ret));
82
@@ -3091,11 +3067,17 @@
84
static void rtl8139_mmio_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
86
+#ifdef TARGET_WORDS_BIGENDIAN
89
rtl8139_io_writew(opaque, addr & 0xFF, val);
92
static void rtl8139_mmio_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
94
+#ifdef TARGET_WORDS_BIGENDIAN
97
rtl8139_io_writel(opaque, addr & 0xFF, val);
100
@@ -3106,12 +3088,20 @@
102
static uint32_t rtl8139_mmio_readw(void *opaque, target_phys_addr_t addr)
104
- return rtl8139_io_readw(opaque, addr & 0xFF);
105
+ uint32_t val = rtl8139_io_readw(opaque, addr & 0xFF);
106
+#ifdef TARGET_WORDS_BIGENDIAN
107
+ val = bswap16(val);
112
static uint32_t rtl8139_mmio_readl(void *opaque, target_phys_addr_t addr)
114
- return rtl8139_io_readl(opaque, addr & 0xFF);
115
+ uint32_t val = rtl8139_io_readl(opaque, addr & 0xFF);
116
+#ifdef TARGET_WORDS_BIGENDIAN
117
+ val = bswap32(val);