Thanks, applied.
On Wed, Dec 8, 2010 at 11:05 AM, Alexander Graf <ag...@suse.de> wrote: > The way mmio endianness is currently implemented is horrifying. > > In the real world, CPUs have an endianness and write out data > to the memory bus. Instead of RAM, a receiving side here can be > a device. This device gets a byte stream again and needs to > make sense of it. > > Since big endian systems write big endian numbers into memory > while little endian systems write little endian numbers there, > the device and software on the CPU need to be aware of this. > > In practice, most devices these days (ISA, PCI) assume that > the data is little endian. So to communicate with such a device > from the CPU's side, the OS byte swaps all MMIO. > > In qemu however, we simply pass the register value we find on > to the device. So any byte mangling the guest does to compensate > for the transfer screw us up by exposing byte swapped MMIO > on the device's side. > > The way this has been fixed historically is by constructs like > this one: > > #ifdef TARGET_WORDS_BIGENDIAN > val = bswap32(val); > #endif > > With the move to get device code only compiled once, this has > become harder and harder to justify though, since we don't know > the target endianness during compile time. > > It's especially bad since it doesn't make any sense at all to > clutter all the device code with endianness workarounds, aside > from the fact that about 80% of the device code currently does > the wrong thing :). > > So my solution to the issue is to make every device define if > it's a little, big or native (target) endianness device. This > basically tells the layers below what endianness the device > expects mmio to occur in. Little endian devices on little endian > hosts don't swap. On big endian hosts they do. Same the other > way around. > > The only reason I added "native" endianness is that we have some > PV devices like the fw_cfg that expect qemu's broken behavior. > These devices are the minority though. In the long run I'd expect > to see most code be committed with either of the two endianness > choices. > > The patch set also includes a bunch of conversions for devices > that were already aware of endianness. > > For easy testing or pulling, please use this repo: > > git://repo.or.cz/qemu/agraf.git qemu-endian-fix-v2 > > v0->v1: > > - make LE targets compile > - add one missing conversion > - make endian choice be an enum > > v1 -> v2: > > - rebase (this thing bitrots _fast_!) > > Alexander Graf (15): > exec: introduce endianness swapped mmio > Add endianness as io mem parameter > Make simple io mem handler endian aware > dbdma: Make little endian > pci-host: Delegate bswap to mmio layer > uninorth: Get rid of bswap > e1000: Make little endian > prep: Declare as little endian > versatile_pci: Declare as little endian > ppc4xx_pci: Declare as little endian > openpic: Replace explicit byte swap with endian hints > rtl8139: Declare as little endian > heathrow_pic: Declare as little endian > isa_mmio: Always use little endian > usb_ohci: Always use little endian > > Makefile.objs | 3 + > Makefile.target | 7 -- > cpu-common.h | 8 ++- > exec.c | 142 > +++++++++++++++++++++++++++++++++++++++++--- > hw/apb_pci.c | 9 ++- > hw/apic.c | 3 +- > hw/arm_gic.c | 3 +- > hw/arm_sysctl.c | 3 +- > hw/arm_timer.c | 5 +- > hw/armv7m.c | 2 +- > hw/axis_dev88.c | 6 +- > hw/bonito.c | 19 ++++-- > hw/cirrus_vga.c | 12 +++- > hw/cs4231.c | 3 +- > hw/cuda.c | 3 +- > hw/dec_pci.c | 6 +- > hw/dp8393x.c | 3 +- > hw/ds1225y.c | 6 +- > hw/e1000.c | 11 +--- > hw/eccmemctl.c | 6 +- > hw/eepro100.c | 3 +- > hw/empty_slot.c | 3 +- > hw/escc.c | 3 +- > hw/esp.c | 3 +- > hw/etraxfs_dma.c | 2 +- > hw/etraxfs_eth.c | 3 +- > hw/etraxfs_pic.c | 3 +- > hw/etraxfs_ser.c | 3 +- > hw/etraxfs_timer.c | 3 +- > hw/fdc.c | 6 +- > hw/fw_cfg.c | 6 +- > hw/g364fb.c | 3 +- > hw/grackle_pci.c | 6 +- > hw/gt64xxx.c | 9 +-- > hw/heathrow_pic.c | 5 +- > hw/hpet.c | 3 +- > hw/ide/macio.c | 3 +- > hw/ide/mmio.c | 6 +- > hw/integratorcp.c | 9 ++- > hw/intel-hda.c | 3 +- > hw/ioapic.c | 3 +- > hw/isa.h | 2 +- > hw/isa_mmio.c | 100 ++++++------------------------- > hw/ivshmem.c | 2 +- > hw/jazz_led.c | 3 +- > hw/lan9118.c | 3 +- > hw/lance.c | 3 +- > hw/lsi53c895a.c | 6 +- > hw/m48t59.c | 3 +- > hw/mac_dbdma.c | 6 +- > hw/mac_nvram.c | 3 +- > hw/marvell_88w8618_audio.c | 3 +- > hw/mcf5206.c | 3 +- > hw/mcf5208.c | 6 +- > hw/mcf_fec.c | 3 +- > hw/mcf_intc.c | 3 +- > hw/mcf_uart.c | 3 +- > hw/mips_jazz.c | 13 ++--- > hw/mips_malta.c | 3 +- > hw/mips_mipssim.c | 6 +-- > hw/mips_r4k.c | 9 +-- > hw/mpcore.c | 3 +- > hw/msix.c | 3 +- > hw/mst_fpga.c | 2 +- > hw/musicpal.c | 24 +++++--- > hw/omap.h | 3 +- > hw/omap1.c | 42 +++++++------ > hw/omap2.c | 4 +- > hw/omap_dma.c | 4 +- > hw/omap_dss.c | 2 +- > hw/omap_gpio.c | 2 +- > hw/omap_gpmc.c | 2 +- > hw/omap_i2c.c | 2 +- > hw/omap_intc.c | 4 +- > hw/omap_l4.c | 5 +- > hw/omap_lcdc.c | 2 +- > hw/omap_mmc.c | 2 +- > hw/omap_sdrc.c | 2 +- > hw/omap_sx1.c | 15 +++-- > hw/omap_uart.c | 2 +- > hw/onenand.c | 2 +- > hw/openpic.c | 29 ++------- > hw/palm.c | 12 +++- > hw/parallel.c | 3 +- > hw/pci_host.c | 101 ++++++------------------------- > hw/pci_host.h | 6 +- > hw/pcie_host.c | 3 +- > hw/pckbd.c | 3 +- > hw/pcnet-pci.c | 3 +- > hw/pflash_cfi01.c | 6 +- > hw/pflash_cfi02.c | 4 +- > hw/pl011.c | 3 +- > hw/pl022.c | 3 +- > hw/pl031.c | 3 +- > hw/pl050.c | 3 +- > hw/pl061.c | 3 +- > hw/pl080.c | 3 +- > hw/pl110.c | 3 +- > hw/pl181.c | 4 +- > hw/pl190.c | 3 +- > hw/ppc405_boards.c | 6 +- > hw/ppc405_uc.c | 11 ++- > hw/ppc440.c | 2 +- > hw/ppc4xx_pci.c | 19 +----- > hw/ppc_newworld.c | 5 +- > hw/ppc_oldworld.c | 2 +- > hw/ppc_prep.c | 40 ++----------- > hw/ppce500_mpc8544ds.c | 2 +- > hw/ppce500_pci.c | 9 ++- > hw/prep_pci.c | 3 +- > hw/pxa2xx.c | 25 ++++---- > hw/pxa2xx_dma.c | 2 +- > hw/pxa2xx_gpio.c | 2 +- > hw/pxa2xx_keypad.c | 2 +- > hw/pxa2xx_lcd.c | 2 +- > hw/pxa2xx_mmci.c | 2 +- > hw/pxa2xx_pcmcia.c | 6 +- > hw/pxa2xx_pic.c | 2 +- > hw/pxa2xx_timer.c | 2 +- > hw/r2d.c | 3 +- > hw/rc4030.c | 6 +- > hw/realview.c | 3 +- > hw/realview_gic.c | 3 +- > hw/rtl8139.c | 15 +---- > hw/sbi.c | 3 +- > hw/serial.c | 6 +- > hw/sh7750.c | 6 +- > hw/sh_intc.c | 3 +- > hw/sh_pci.c | 7 +- > hw/sh_serial.c | 3 +- > hw/sh_timer.c | 3 +- > hw/slavio_intctl.c | 6 +- > hw/slavio_misc.c | 24 +++++--- > hw/slavio_timer.c | 3 +- > hw/sm501.c | 9 ++- > hw/smc91c111.c | 3 +- > hw/sparc32_dma.c | 3 +- > hw/spitz.c | 2 +- > hw/stellaris.c | 12 +++- > hw/stellaris_enet.c | 3 +- > hw/sun4c_intctl.c | 3 +- > hw/sun4m_iommu.c | 3 +- > hw/sun4u.c | 4 +- > hw/syborg_fb.c | 3 +- > hw/syborg_interrupt.c | 3 +- > hw/syborg_keyboard.c | 3 +- > hw/syborg_pointer.c | 3 +- > hw/syborg_rtc.c | 3 +- > hw/syborg_serial.c | 3 +- > hw/syborg_timer.c | 3 +- > hw/syborg_virtio.c | 3 +- > hw/tc6393xb.c | 2 +- > hw/tcx.c | 5 +- > hw/tusb6010.c | 2 +- > hw/unin_pci.c | 26 +++++--- > hw/usb-ohci.c | 10 +--- > hw/versatile_pci.c | 21 +------ > hw/versatilepb.c | 3 +- > hw/vga-isa-mm.c | 6 +- > hw/vga.c | 3 +- > hw/vmware_vga.c | 2 +- > hw/wdt_i6300esb.c | 3 +- > hw/xilinx_ethlite.c | 2 +- > hw/xilinx_intc.c | 2 +- > hw/xilinx_timer.c | 3 +- > hw/xilinx_uartlite.c | 3 +- > hw/zaurus.c | 2 +- > rwhandler.c | 4 +- > rwhandler.h | 2 +- > 169 files changed, 663 insertions(+), 598 deletions(-) > >