From: Paolo Bonzini Date: Mon, 22 Jul 2013 13:54:26 +0000 (+0200) Subject: pc-testdev: support 8 and 16-bit accesses to 0xe0 X-Git-Tag: v1.6.0-rc0~74 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b7faba71635cc4b16bb1472614aa497554797af6;p=thirdparty%2Fqemu.git pc-testdev: support 8 and 16-bit accesses to 0xe0 This will let us use the testdev to test endianness. Signed-off-by: Paolo Bonzini Reviewed-by: Anthony Liguori Message-id: 1374501278-31549-17-git-send-email-pbonzini@redhat.com Signed-off-by: Anthony Liguori --- diff --git a/hw/misc/pc-testdev.c b/hw/misc/pc-testdev.c index 699a16ffbeb..6588ea23a58 100644 --- a/hw/misc/pc-testdev.c +++ b/hw/misc/pc-testdev.c @@ -80,13 +80,20 @@ static void test_ioport_write(void *opaque, hwaddr addr, uint64_t data, unsigned len) { PCTestdev *dev = opaque; - dev->ioport_data = data; + int bits = len * 8; + int start_bit = (addr & 3) * 8; + uint32_t mask = ((uint32_t)-1 >> (32 - bits)) << start_bit; + dev->ioport_data &= ~mask; + dev->ioport_data |= data << start_bit; } static uint64_t test_ioport_read(void *opaque, hwaddr addr, unsigned len) { PCTestdev *dev = opaque; - return dev->ioport_data; + int bits = len * 8; + int start_bit = (addr & 3) * 8; + uint32_t mask = ((uint32_t)-1 >> (32 - bits)) << start_bit; + return (dev->ioport_data & mask) >> start_bit; } static const MemoryRegionOps test_ioport_ops = {