[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/22] memory: split accesses even when the old MMIO
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 18/22] memory: split accesses even when the old MMIO callbacks are used |
Date: |
Thu, 30 May 2013 23:03:52 +0200 |
This is useful for 64-bit memory accesses.
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
memory.c | 63 +++++++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 46 insertions(+), 17 deletions(-)
diff --git a/memory.c b/memory.c
index 679bd8d..ca27102 100644
--- a/memory.c
+++ b/memory.c
@@ -302,6 +302,20 @@ static void flatview_simplify(FlatView *view)
}
}
+static void memory_region_oldmmio_read_accessor(void *opaque,
+ hwaddr addr,
+ uint64_t *value,
+ unsigned size,
+ unsigned shift,
+ uint64_t mask)
+{
+ MemoryRegion *mr = opaque;
+ uint64_t tmp;
+
+ tmp = mr->ops->old_mmio.read[ctz32(size)](mr->opaque, addr);
+ *value |= (tmp & mask) << shift;
+}
+
static void memory_region_read_accessor(void *opaque,
hwaddr addr,
uint64_t *value,
@@ -319,6 +333,20 @@ static void memory_region_read_accessor(void *opaque,
*value |= (tmp & mask) << shift;
}
+static void memory_region_oldmmio_write_accessor(void *opaque,
+ hwaddr addr,
+ uint64_t *value,
+ unsigned size,
+ unsigned shift,
+ uint64_t mask)
+{
+ MemoryRegion *mr = opaque;
+ uint64_t tmp;
+
+ tmp = (*value >> shift) & mask;
+ mr->ops->old_mmio.write[ctz32(size)](mr->opaque, addr, tmp);
+}
+
static void memory_region_write_accessor(void *opaque,
hwaddr addr,
uint64_t *value,
@@ -359,6 +387,8 @@ static void access_with_adjusted_size(hwaddr addr,
if (!access_size_max) {
access_size_max = 4;
}
+
+ /* FIXME: support unaligned access? */
access_size = MAX(MIN(size, access_size_max), access_size_min);
access_mask = -1ULL >> (64 - access_size * 8);
for (i = 0; i < size; i += access_size) {
@@ -902,16 +932,16 @@ static uint64_t memory_region_dispatch_read1(MemoryRegion
*mr,
return unassigned_mem_read(mr, addr, size);
}
- if (!mr->ops->read) {
- return mr->ops->old_mmio.read[ctz32(size)](mr->opaque, addr);
+ if (mr->ops->read) {
+ access_with_adjusted_size(addr, &data, size,
+ mr->ops->impl.min_access_size,
+ mr->ops->impl.max_access_size,
+ memory_region_read_accessor, mr);
+ } else {
+ access_with_adjusted_size(addr, &data, size, 1, 4,
+ memory_region_oldmmio_read_accessor, mr);
}
- /* FIXME: support unaligned access */
- access_with_adjusted_size(addr, &data, size,
- mr->ops->impl.min_access_size,
- mr->ops->impl.max_access_size,
- memory_region_read_accessor, mr);
-
return data;
}
@@ -956,16 +986,15 @@ static void memory_region_dispatch_write(MemoryRegion *mr,
adjust_endianness(mr, &data, size);
- if (!mr->ops->write) {
- mr->ops->old_mmio.write[ctz32(size)](mr->opaque, addr, data);
- return;
+ if (mr->ops->write) {
+ access_with_adjusted_size(addr, &data, size,
+ mr->ops->impl.min_access_size,
+ mr->ops->impl.max_access_size,
+ memory_region_write_accessor, mr);
+ } else {
+ access_with_adjusted_size(addr, &data, size, 1, 4,
+ memory_region_oldmmio_write_accessor, mr);
}
-
- /* FIXME: support unaligned access */
- access_with_adjusted_size(addr, &data, size,
- mr->ops->impl.min_access_size,
- mr->ops->impl.max_access_size,
- memory_region_write_accessor, mr);
}
void memory_region_init_io(MemoryRegion *mr,
--
1.7.4.1
- [Qemu-devel] [PATCH 09/22] memory: assign MemoryRegionOps to all regions, (continued)
- [Qemu-devel] [PATCH 09/22] memory: assign MemoryRegionOps to all regions, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 07/22] memory: add address_space_translate, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 10/22] exec: expect mr->ops to be initialized for ROM, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 11/22] exec: introduce memory_access_is_direct, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 12/22] exec: introduce memory_access_size, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 13/22] memory: export memory_region_access_valid to exec.c, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 14/22] exec: implement .valid.accepts for subpages, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 15/22] memory: add address_space_access_valid, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 16/22] memory: accept mismatching sizes in memory_region_access_valid, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 17/22] memory: add big endian support to access_with_adjusted_size, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 18/22] memory: split accesses even when the old MMIO callbacks are used,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 19/22] memory: correctly handle endian-swapped 64-bit accesses, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 20/22] exec: just use io_mem_read/io_mem_write for 8-byte I/O accesses, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 21/22] memory: propagate errors on I/O dispatch, Paolo Bonzini, 2013/05/30
- [Qemu-devel] [PATCH 22/22] memory: add return value to address_space_rw/read/write, Paolo Bonzini, 2013/05/30