[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 01/16] memory: move endianness compensation to m
From: |
Andreas Färber |
Subject: |
Re: [Qemu-devel] [PATCH 01/16] memory: move endianness compensation to memory core |
Date: |
Thu, 05 Jan 2012 19:26:26 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:9.0) Gecko/20111220 Thunderbird/9.0 |
Am 02.01.2012 17:33, schrieb Avi Kivity:
> Instead of doing device endianness compensation in cpu_register_io_memory(),
> do it in the memory core.
>
> Signed-off-by: Avi Kivity <address@hidden>
This further broke PReP boot (Etch 2.4.x kernel):
be675c972088eba210e18dc125613e9f205a6bfb is the first bad commit
commit be675c972088eba210e18dc125613e9f205a6bfb
Author: Avi Kivity <address@hidden>
Date: Sun Nov 20 16:22:55 2011 +0200
memory: move endianness compensation to memory core
Instead of doing device endianness compensation in
cpu_register_io_memory(),
do it in the memory core.
Signed-off-by: Avi Kivity <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
:100644 100644 698d7fc4118edc71f00de6f87908bb4031df5b5a
79f989c65469ad068448f334b692b7ed60f1704a M exec-obsolete.h
:100644 100644 28c057c08671a8b6bfa90d94e873460bda7afa69
507d37c61761d71d8b39d0073724ceb0200ff6d4 M exec.c
:100644 100644 868ffd0bc5a1eea7a6f9deb9d6d39f689b89e014
6f9fea15ad1890c63c285fd62e72b8614030dd4f M memory.c
My wild guess is that prep_pci.c is swapping too much or not enough now.
The bswap calls in the native-endian PCIIO there look fishy.
Andreas
register PCI host 'pci-bridge' 'pci' '<null>' 'PREP Host PCI Bridge -
Motorola Raven'
register 'pci-bridge' 'pci' '<null>' 'PREP Host PCI Bridge - Motorola
Raven' 0x80000000 in 'device-tree' 0xffffffff
Done 582b000 582b880
PCI device '<null>' 0 11 0 has no reg properties:
PCI device '<null>' 0 11 0 has no assigned addresses properties:
register pci device 'Qemu VGA' 0000000c 'display' 'VGA' 'Qemu VGA'
register 'Qemu VGA' 'display' 'VGA' 'Qemu VGA' 0x0000000c in
'pci-bridge' 0x80000000
Done 582b880 582b980
PCI device 'Qemu VGA' 0 12 0 reg properties:
addr: 82006010 00000000 f0000000 size: 00000000 00800000
PCI device 'Qemu VGA' 0 12 0 assigned addresses properties:
addr: 82006010 00000000 f0000000 size: 00000000 00800000
PPC Open Hack'Ware BIOS for qemu version 0.4.1
Build 2007-10-01 06:42:47
Copyright 2003-2005 Jocelyn Mayer
Memory size: 256 MB.
Booting from device m
ide0: drive 0: Hard Disk
ERROR: OF_property_copy cannot get property 'hd' for aliases
ERROR: WIN_READ_NATIVE_MAX : status 50 != 0x40
ide0: drive 1: none
ide1: drive 0: CD-ROM
ERROR: OF_property_copy cannot get property 'cd' for aliases
ERROR: ATAPI TEST_UNIT_READY : status 41 != 0x40
ide1: drive 1: none
Probe partitions for device m
ERROR: No MSDOS signature (38 0 0 0)
Use bloc device as raw partition
Boot partition: 0 9401fff8 9401fff8 0
ERROR: OF_property_copy cannot get property 'alias' for <null>
boot device: 5832080 image 1000000 size 1266665
Probe filesystem on unknown PREP partition 'PREP boot' (bootable) 5832100
Fix bootfile
Partition is bootable (0)
bd_set_boot_part: part 5832100 (0) 0
Boot partition: 5832100 582e400 582e400 0
boot device: 5832080
ERROR: Found boot partition : 5832100 582e400
ERROR: Not a MACH-O file
ERROR: Not an Apple CHRP boot file !
dest 100000 entry 00000200 => 100200
Load raw file into memory at 100000 1266665 (001353e9) 0 (00000000)
Boot: 00040000 e9531300 00000000 00000000
Bootinfos at : 300000
Now boot it... (0)
stack: 5bfff80 malloc_base: 0 0x05800000 0x06000000
PREP boot... 100200 100000
loaded at: 00100200 0023DDE8
relocated to: 00800000 0093DBE8
board data at: 05837000 0583DA0C
relocated to: 0093414C 0093AB58
zimage at: 00805B9C 00933AC6
avail ram: 00400000 00800000
Linux/PPC load: ide0=0x1f0,0x3f6,13 ide1=0x170,0x376,13
netdev=9,0x300,eth0 console=ttyS0 console=tty0 root=/dev/hda3 ro
Uncompressing Linux...done.
Now booting the kernel
Memory BAT mapping: BAT2=256Mb, BAT3=0Mb, residual: 0Mb
Total memory = 256MB; using 512kB for hash table (at c0300000)
Linux version 2.4.36.1 (address@hidden) (gcc version 4.1.2 20061115
(prerelease) (Debian 4.1.1-21)) #3 Thu Feb 21 10:14:55 CET 2008
PReP architecture
On node 0 totalpages: 65536
zone(0): 65536 pages.
zone(1): 0 pages.
zone(2): 0 pages.
Kernel command line: ide0=0x1f0,0x3f6,13 ide1=0x170,0x376,13
netdev=9,0x300,eth0 console=ttyS0 console=tty0 root=/dev/hda3 ro
ide_setup: ide0=0x1f0,0x3f6,13
ide_setup: ide1=0x170,0x376,13
time_init: decrementer frequency = 28.252727 MHz
Warning: real time clock seems stuck!
Console: colour dummy device 80x25
Calibrating delay loop... 251.49 BogoMIPS
Memory: 255232k available (2052k kernel code, 816k data, 168k init, 0k
highmem)
Dentry cache hash table entries: 32768 (order: 6, 262144 bytes)
Inode cache hash table entries: 16384 (order: 5, 131072 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 16384 (order: 4, 65536 bytes)
Page-cache hash table entries: 65536 (order: 6, 262144 bytes)
POSIX conformance testing by UNIFIX
PCI: Probing PCI hardware
Setting PCI interrupts for a "Mesquite cPCI (MCP750)"
PCI: Cannot allocate resource region 0 of device 00:0c.0
PCI: moved device 00:0c.0 resource 0 (1208) to 0
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Journalled Block Device driver loaded
Installing knfsd (copyright (C) 1996 address@hidden).
udf: registering filesystem
vga16fb: mapped to 0xf00a0000
Console: switching to colour frame buffer device 80x30
fb0: VGA16 VGA frame buffer device
pty: 256 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with MANY_PORTS SHARE_IRQ
SERIAL_PCI enabled
ttyS00 at 0x03f8 (irq = 4) is a 16550A
rtc: I/O resource 70 is not free.
Generic RTC Driver v1.07
Floppy drive(s): fd0 is 2.88M
FDC 0 is a S82078B
ne.c:v1.10 9/23/94 Donald Becker (address@hidden)
Last modified Nov 1, 2000 by Paul Gortmaker
NE*000 ethercard probe at 0x300: 52 54 00 12 34 56
eth0: NE2000 found at 0x300, using IRQ 9.
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
loop: loaded (max 8 devices)
PPP generic driver version 2.4.2
PPP Deflate Compression module registered
PPP BSD Compression module registered
Universal TUN/TAP device driver 1.5 (C)1999-2002 Maxim Krasnyansky
Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
Probing IDE interface ide0...
hda: EQUMH RADDSI K, ATA DISK drive
Probing IDE interface ide1...
hdc: EQUMD DVR-MO, ATAPI cdrom or floppy?, assuming FLOPPY drive
Probing IDE interface ide2...
ide2: Wait for ready failed before probe !
Probing IDE interface ide3...
ide3: Wait for ready failed before probe !
ide0 at 0x1f0-0x1f7,0x3f6 on irq 13
ide1 at 0x170-0x177,0x376 on irq 13 (shared with ide0)
hda: attached ide-disk driver.
hda: 0 sectors (0 MB) w/1KiB Cache, CHS=24856/0/0
hda: INVALID GEOMETRY: 0 PHYSICAL HEADS?
Partition check:
hdc:end_request: I/O error, dev 16:00 (hdc), sector 0
end_request: I/O error, dev 16:00 (hdc), sector 2
end_request: I/O error, dev 16:00 (hdc), sector 4
end_request: I/O error, dev 16:00 (hdc), sector 6
end_request: I/O error, dev 16:00 (hdc), sector 0
end_request: I/O error, dev 16:00 (hdc), sector 2
end_request: I/O error, dev 16:00 (hdc), sector 4
end_request: I/O error, dev 16:00 (hdc), sector 6
unable to read partition table
Macintosh non-volatile memory driver v1.0
mice: PS/2 mouse device common for all mice
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 2048 buckets, 16Kbytes
TCP: Hash tables configured (established 16384 bind 32768)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
hda3: bad access: block=2, count=2
end_request: I/O error, dev 03:03 (hda), sector 2
EXT3-fs: unable to read superblock
hda3: bad access: block=2, count=2
end_request: I/O error, dev 03:03 (hda), sector 2
EXT2-fs: unable to read superblock
hda3: bad access: block=0, count=8
end_request: I/O error, dev 03:03 (hda), sector 0
hda3: bad access: block=2, count=6
end_request: I/O error, dev 03:03 (hda), sector 2
hda3: bad access: block=4, count=4
end_request: I/O error, dev 03:03 (hda), sector 4
hda3: bad access: block=6, count=2
end_request: I/O error, dev 03:03 (hda), sector 6
hda3: bad access: block=0, count=16
end_request: I/O error, dev 03:03 (hda), sector 0
hda3: bad access: block=2, count=14
end_request: I/O error, dev 03:03 (hda), sector 2
hda3: bad access: block=4, count=12
end_request: I/O error, dev 03:03 (hda), sector 4
hda3: bad access: block=6, count=10
end_request: I/O error, dev 03:03 (hda), sector 6
hda3: bad access: block=8, count=8
end_request: I/O error, dev 03:03 (hda), sector 8
hda3: bad access: block=10, count=6
end_request: I/O error, dev 03:03 (hda), sector 10
hda3: bad access: block=12, count=4
end_request: I/O error, dev 03:03 (hda), sector 12
hda3: bad access: block=14, count=2
end_request: I/O error, dev 03:03 (hda), sector 14
hda3: bad access: block=8, count=16
end_request: I/O error, dev 03:03 (hda), sector 8
hda3: bad access: block=10, count=14
end_request: I/O error, dev 03:03 (hda), sector 10
hda3: bad access: block=12, count=12
end_request: I/O error, dev 03:03 (hda), sector 12
hda3: bad access: block=14, count=10
end_request: I/O error, dev 03:03 (hda), sector 14
hda3: bad access: block=16, count=8
end_request: I/O error, dev 03:03 (hda), sector 16
hda3: bad access: block=18, count=6
end_request: I/O error, dev 03:03 (hda), sector 18
hda3: bad access: block=20, count=4
end_request: I/O error, dev 03:03 (hda), sector 20
hda3: bad access: block=22, count=2
end_request: I/O error, dev 03:03 (hda), sector 22
hda3: bad access: block=16, count=16
end_request: I/O error, dev 03:03 (hda), sector 16
hda3: bad access: block=18, count=14
end_request: I/O error, dev 03:03 (hda), sector 18
hda3: bad access: block=20, count=12
end_request: I/O error, dev 03:03 (hda), sector 20
hda3: bad access: block=22, count=10
end_request: I/O error, dev 03:03 (hda), sector 22
hda3: bad access: block=24, count=8
end_request: I/O error, dev 03:03 (hda), sector 24
hda3: bad access: block=26, count=6
end_request: I/O error, dev 03:03 (hda), sector 26
hda3: bad access: block=28, count=4
end_request: I/O error, dev 03:03 (hda), sector 28
hda3: bad access: block=30, count=2
end_request: I/O error, dev 03:03 (hda), sector 30
hda3: bad access: block=24, count=8
end_request: I/O error, dev 03:03 (hda), sector 24
hda3: bad access: block=26, count=6
end_request: I/O error, dev 03:03 (hda), sector 26
hda3: bad access: block=28, count=4
end_request: I/O error, dev 03:03 (hda), sector 28
hda3: bad access: block=30, count=2
end_request: I/O error, dev 03:03 (hda), sector 30
cramfs: wrong magic
hda3: bad access: block=0, count=1
end_request: I/O error, dev 03:03 (hda), sector 0
FAT: unable to read boot sector
hda3: bad access: block=0, count=1
end_request: I/O error, dev 03:03 (hda), sector 0
FAT: unable to read boot sector
hda3: bad access: block=64, count=2
end_request: I/O error, dev 03:03 (hda), sector 64
isofs_read_super: bread failed, dev=03:03, iso_blknum=16, block=32
hda3: bad access: block=2, count=1
end_request: I/O error, dev 03:03 (hda), sector 2
HFS+-fs: unable to read VHDR or MDB
hda3: bad access: block=2, count=1
end_request: I/O error, dev 03:03 (hda), sector 2
hfs_fs: unable to read block 0x00000002 from dev 03:03
hfs_fs: Unable to read superblock
hda3: bad access: block=0, count=1
end_request: I/O error, dev 03:03 (hda), sector 0
hfs_fs: unable to read block 0x00000000 from dev 03:03
hfs_fs: Unable to read block 0.
You didn't specify the type of your ufs filesystem
mount -t ufs -o
ufstype=sun|sunx86|44bsd|old|hp|nextstep|netxstep-cd|openstep ...
>>>WARNING<<< Wrong ufstype may corrupt your filesystem, default is
ufstype=old
hda3: bad access: block=16, count=2
end_request: I/O error, dev 03:03 (hda), sector 16
hda3: bad access: block=0, count=2
end_request: I/O error, dev 03:03 (hda), sector 0
romfs: unable to read superblock
hda3: bad access: block=64, count=4
end_request: I/O error, dev 03:03 (hda), sector 64
hda3: bad access: block=1248, count=4
end_request: I/O error, dev 03:03 (hda), sector 1248
hda3: bad access: block=1024, count=4
end_request: I/O error, dev 03:03 (hda), sector 1024
UDF-fs: No partition found (1)
Kernel panic: VFS: Unable to mount root fs on 03:03
<0>Rebooting in 180 seconds..
> ---
> exec-obsolete.h | 2 +-
> exec.c | 142
> ++++---------------------------------------------------
> memory.c | 37 ++++++++++++--
> 3 files changed, 41 insertions(+), 140 deletions(-)
>
> diff --git a/exec-obsolete.h b/exec-obsolete.h
> index 698d7fc..79f989c 100644
> --- a/exec-obsolete.h
> +++ b/exec-obsolete.h
> @@ -33,7 +33,7 @@ void qemu_ram_free_from_ptr(ram_addr_t addr);
>
> int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
> CPUWriteMemoryFunc * const *mem_write,
> - void *opaque, enum device_endian endian);
> + void *opaque);
> void cpu_unregister_io_memory(int table_address);
>
> void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
> diff --git a/exec.c b/exec.c
> index 28c057c..507d37c 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -3507,8 +3507,7 @@ static int subpage_register (subpage_t *mmio, uint32_t
> start, uint32_t end,
> mmio = g_malloc0(sizeof(subpage_t));
>
> mmio->base = base;
> - subpage_memory = cpu_register_io_memory(subpage_read, subpage_write,
> mmio,
> - DEVICE_NATIVE_ENDIAN);
> + subpage_memory = cpu_register_io_memory(subpage_read, subpage_write,
> mmio);
> #if defined(DEBUG_SUBPAGE)
> printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
> mmio, base, TARGET_PAGE_SIZE, subpage_memory);
> @@ -3532,106 +3531,6 @@ static int get_free_io_mem_idx(void)
> return -1;
> }
>
> -/*
> - * Usually, devices operate in little endian mode. There are devices out
> - * there that operate in big endian too. Each device gets byte swapped
> - * mmio if plugged onto a CPU that does the other endianness.
> - *
> - * CPU Device swap?
> - *
> - * little little no
> - * little big yes
> - * big little yes
> - * big big no
> - */
> -
> -typedef struct SwapEndianContainer {
> - CPUReadMemoryFunc *read[3];
> - CPUWriteMemoryFunc *write[3];
> - void *opaque;
> -} SwapEndianContainer;
> -
> -static uint32_t swapendian_mem_readb (void *opaque, target_phys_addr_t addr)
> -{
> - uint32_t val;
> - SwapEndianContainer *c = opaque;
> - val = c->read[0](c->opaque, addr);
> - return val;
> -}
> -
> -static uint32_t swapendian_mem_readw(void *opaque, target_phys_addr_t addr)
> -{
> - uint32_t val;
> - SwapEndianContainer *c = opaque;
> - val = bswap16(c->read[1](c->opaque, addr));
> - return val;
> -}
> -
> -static uint32_t swapendian_mem_readl(void *opaque, target_phys_addr_t addr)
> -{
> - uint32_t val;
> - SwapEndianContainer *c = opaque;
> - val = bswap32(c->read[2](c->opaque, addr));
> - return val;
> -}
> -
> -static CPUReadMemoryFunc * const swapendian_readfn[3]={
> - swapendian_mem_readb,
> - swapendian_mem_readw,
> - swapendian_mem_readl
> -};
> -
> -static void swapendian_mem_writeb(void *opaque, target_phys_addr_t addr,
> - uint32_t val)
> -{
> - SwapEndianContainer *c = opaque;
> - c->write[0](c->opaque, addr, val);
> -}
> -
> -static void swapendian_mem_writew(void *opaque, target_phys_addr_t addr,
> - uint32_t val)
> -{
> - SwapEndianContainer *c = opaque;
> - c->write[1](c->opaque, addr, bswap16(val));
> -}
> -
> -static void swapendian_mem_writel(void *opaque, target_phys_addr_t addr,
> - uint32_t val)
> -{
> - SwapEndianContainer *c = opaque;
> - c->write[2](c->opaque, addr, bswap32(val));
> -}
> -
> -static CPUWriteMemoryFunc * const swapendian_writefn[3]={
> - swapendian_mem_writeb,
> - swapendian_mem_writew,
> - swapendian_mem_writel
> -};
> -
> -static void swapendian_init(int io_index)
> -{
> - SwapEndianContainer *c = g_malloc(sizeof(SwapEndianContainer));
> - int i;
> -
> - /* Swap mmio for big endian targets */
> - c->opaque = io_mem_opaque[io_index];
> - for (i = 0; i < 3; i++) {
> - c->read[i] = io_mem_read[io_index][i];
> - c->write[i] = io_mem_write[io_index][i];
> -
> - io_mem_read[io_index][i] = swapendian_readfn[i];
> - io_mem_write[io_index][i] = swapendian_writefn[i];
> - }
> - io_mem_opaque[io_index] = c;
> -}
> -
> -static void swapendian_del(int io_index)
> -{
> - if (io_mem_read[io_index][0] == swapendian_readfn[0]) {
> - g_free(io_mem_opaque[io_index]);
> - }
> -}
> -
> /* mem_read and mem_write are arrays of functions containing the
> function to access byte (index 0), word (index 1) and dword (index
> 2). Functions can be omitted with a NULL function pointer.
> @@ -3642,7 +3541,7 @@ static void swapendian_del(int io_index)
> static int cpu_register_io_memory_fixed(int io_index,
> CPUReadMemoryFunc * const *mem_read,
> CPUWriteMemoryFunc * const
> *mem_write,
> - void *opaque, enum device_endian
> endian)
> + void *opaque)
> {
> int i;
>
> @@ -3666,30 +3565,14 @@ static int cpu_register_io_memory_fixed(int io_index,
> }
> io_mem_opaque[io_index] = opaque;
>
> - switch (endian) {
> - case DEVICE_BIG_ENDIAN:
> -#ifndef TARGET_WORDS_BIGENDIAN
> - swapendian_init(io_index);
> -#endif
> - break;
> - case DEVICE_LITTLE_ENDIAN:
> -#ifdef TARGET_WORDS_BIGENDIAN
> - swapendian_init(io_index);
> -#endif
> - break;
> - case DEVICE_NATIVE_ENDIAN:
> - default:
> - break;
> - }
> -
> return (io_index << IO_MEM_SHIFT);
> }
>
> int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
> CPUWriteMemoryFunc * const *mem_write,
> - void *opaque, enum device_endian endian)
> + void *opaque)
> {
> - return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque,
> endian);
> + return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque);
> }
>
> void cpu_unregister_io_memory(int io_table_address)
> @@ -3697,8 +3580,6 @@ void cpu_unregister_io_memory(int io_table_address)
> int i;
> int io_index = io_table_address >> IO_MEM_SHIFT;
>
> - swapendian_del(io_index);
> -
> for (i=0;i < 3; i++) {
> io_mem_read[io_index][i] = unassigned_mem_read[i];
> io_mem_write[io_index][i] = unassigned_mem_write[i];
> @@ -3712,23 +3593,18 @@ static void io_mem_init(void)
> int i;
>
> cpu_register_io_memory_fixed(IO_MEM_ROM, error_mem_read,
> - unassigned_mem_write, NULL,
> - DEVICE_NATIVE_ENDIAN);
> + unassigned_mem_write, NULL);
> cpu_register_io_memory_fixed(IO_MEM_UNASSIGNED, unassigned_mem_read,
> - unassigned_mem_write, NULL,
> - DEVICE_NATIVE_ENDIAN);
> + unassigned_mem_write, NULL);
> cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read,
> - notdirty_mem_write, NULL,
> - DEVICE_NATIVE_ENDIAN);
> + notdirty_mem_write, NULL);
> cpu_register_io_memory_fixed(IO_MEM_SUBPAGE_RAM, subpage_ram_read,
> - subpage_ram_write, NULL,
> - DEVICE_NATIVE_ENDIAN);
> + subpage_ram_write, NULL);
> for (i=0; i<5; i++)
> io_mem_used[i] = 1;
>
> io_mem_watch = cpu_register_io_memory(watch_mem_read,
> - watch_mem_write, NULL,
> - DEVICE_NATIVE_ENDIAN);
> + watch_mem_write, NULL);
> }
>
> static void memory_map_init(void)
> diff --git a/memory.c b/memory.c
> index 868ffd0..6f9fea1 100644
> --- a/memory.c
> +++ b/memory.c
> @@ -857,6 +857,15 @@ static void
> memory_region_destructor_rom_device(MemoryRegion *mr)
> cpu_unregister_io_memory(mr->ram_addr & ~(TARGET_PAGE_MASK |
> IO_MEM_ROMD));
> }
>
> +static bool memory_region_wrong_endianness(MemoryRegion *mr)
> +{
> +#ifdef TARGET_BIG_ENDIAN
> + return mr->ops->endianness == DEVICE_LITTLE_ENDIAN;
> +#else
> + return mr->ops->endianness == DEVICE_BIG_ENDIAN;
> +#endif
> +}
> +
> void memory_region_init(MemoryRegion *mr,
> const char *name,
> uint64_t size)
> @@ -967,12 +976,24 @@ static uint32_t memory_region_read_thunk_b(void *mr,
> target_phys_addr_t addr)
>
> static uint32_t memory_region_read_thunk_w(void *mr, target_phys_addr_t addr)
> {
> - return memory_region_read_thunk_n(mr, addr, 2);
> + uint32_t data;
> +
> + data = memory_region_read_thunk_n(mr, addr, 2);
> + if (memory_region_wrong_endianness(mr)) {
> + data = bswap16(data);
> + }
> + return data;
> }
>
> static uint32_t memory_region_read_thunk_l(void *mr, target_phys_addr_t addr)
> {
> - return memory_region_read_thunk_n(mr, addr, 4);
> + uint32_t data;
> +
> + data = memory_region_read_thunk_n(mr, addr, 4);
> + if (memory_region_wrong_endianness(mr)) {
> + data = bswap32(data);
> + }
> + return data;
> }
>
> static void memory_region_write_thunk_b(void *mr, target_phys_addr_t addr,
> @@ -984,12 +1005,18 @@ static void memory_region_write_thunk_b(void *mr,
> target_phys_addr_t addr,
> static void memory_region_write_thunk_w(void *mr, target_phys_addr_t addr,
> uint32_t data)
> {
> + if (memory_region_wrong_endianness(mr)) {
> + data = bswap16(data);
> + }
> memory_region_write_thunk_n(mr, addr, 2, data);
> }
>
> static void memory_region_write_thunk_l(void *mr, target_phys_addr_t addr,
> uint32_t data)
> {
> + if (memory_region_wrong_endianness(mr)) {
> + data = bswap32(data);
> + }
> memory_region_write_thunk_n(mr, addr, 4, data);
> }
>
> @@ -1014,8 +1041,7 @@ static void memory_region_prepare_ram_addr(MemoryRegion
> *mr)
> mr->destructor = memory_region_destructor_iomem;
> mr->ram_addr = cpu_register_io_memory(memory_region_read_thunk,
> memory_region_write_thunk,
> - mr,
> - mr->ops->endianness);
> + mr);
> mr->backend_registered = true;
> }
>
> @@ -1082,8 +1108,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
> mr->ram_addr = qemu_ram_alloc(size, mr);
> mr->ram_addr |= cpu_register_io_memory(memory_region_read_thunk,
> memory_region_write_thunk,
> - mr,
> - mr->ops->endianness);
> + mr);
> mr->ram_addr |= IO_MEM_ROMD;
> mr->backend_registered = true;
> }
--
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg
- [Qemu-devel] [PATCH 00/16] Kill old-style I/O dispatch, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 01/16] memory: move endianness compensation to memory core, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 11/16] Convert IO_MEM_SUBPAGE_RAM to be a MemoryRegion, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 09/16] Switch cpu_register_physical_memory_log() to use MemoryRegions, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 02/16] exec: make phys_page_find() return a temporary, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 14/16] Remove IO_MEM_SUBPAGE, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 05/16] Fix wrong region_offset when overlaying a page with another, Avi Kivity, 2012/01/02
- [Qemu-devel] [PATCH 08/16] Convert IO_MEM_{RAM, ROM, UNASSIGNED, NOTDIRTY} to MemoryRegions, Avi Kivity, 2012/01/02
- Re: [Qemu-devel] [PATCH 08/16] Convert IO_MEM_{RAM, ROM, UNASSIGNED, NOTDIRTY} to MemoryRegions, Richard Henderson, 2012/01/02
- Re: [Qemu-devel] [PATCH 08/16] Convert IO_MEM_{RAM, ROM, UNASSIGNED, NOTDIRTY} to MemoryRegions, Stefan Hajnoczi, 2012/01/06