[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v4 09/58] memory: add backward compatibility for old p
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [RFC v4 09/58] memory: add backward compatibility for old portio registration |
Date: |
Sun, 17 Jul 2011 14:13:36 +0300 |
Signed-off-by: Avi Kivity <address@hidden>
---
memory.c | 32 ++++++++++++++++++++++++++++++++
memory.h | 17 +++++++++++++++++
2 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/memory.c b/memory.c
index 62bd60b..bb04952 100644
--- a/memory.c
+++ b/memory.c
@@ -211,6 +211,21 @@ static AddressSpace address_space_memory = {
.ops = &address_space_ops_memory,
};
+static const MemoryRegionPortio *find_portio(MemoryRegion *mr, uint64_t offset,
+ unsigned width, bool write)
+{
+ const MemoryRegionPortio *mrp;
+
+ for (mrp = mr->ops->old_portio; mrp->size; ++mrp) {
+ if (offset >= mrp->offset && offset < mrp->offset + mrp->len
+ && width == mrp->size
+ && (write ? (bool)mrp->write : (bool)mrp->read)) {
+ return mrp;
+ }
+ }
+ return NULL;
+}
+
static void memory_region_iorange_read(IORange *iorange,
uint64_t offset,
unsigned width,
@@ -218,6 +233,15 @@ static void memory_region_iorange_read(IORange *iorange,
{
MemoryRegion *mr = container_of(iorange, MemoryRegion, iorange);
+ if (mr->ops->old_portio) {
+ const MemoryRegionPortio *mrp = find_portio(mr, offset, width, false);
+
+ *data = ((uint64_t)1 << (width * 8)) - 1;
+ if (mrp) {
+ *data = mrp->read(mr->opaque, offset - mrp->offset);
+ }
+ return;
+ }
*data = mr->ops->read(mr->opaque, offset, width);
}
@@ -228,6 +252,14 @@ static void memory_region_iorange_write(IORange *iorange,
{
MemoryRegion *mr = container_of(iorange, MemoryRegion, iorange);
+ if (mr->ops->old_portio) {
+ const MemoryRegionPortio *mrp = find_portio(mr, offset, width, true);
+
+ if (mrp) {
+ mrp->write(mr->opaque, offset - mrp->offset, data);
+ }
+ return;
+ }
mr->ops->write(mr->opaque, offset, data, width);
}
diff --git a/memory.h b/memory.h
index 2afbf13..f026eae 100644
--- a/memory.h
+++ b/memory.h
@@ -10,9 +10,11 @@
#include "targphys.h"
#include "qemu-queue.h"
#include "iorange.h"
+#include "ioport.h"
typedef struct MemoryRegionOps MemoryRegionOps;
typedef struct MemoryRegion MemoryRegion;
+typedef struct MemoryRegionPortio MemoryRegionPortio;
/* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic
* registration.
@@ -65,6 +67,11 @@ struct MemoryRegionOps {
*/
bool unaligned;
} impl;
+
+ /* If .read and .write are not present, old_portio may be used for
+ * backwards compatibility with old portio registration
+ */
+ const MemoryRegionPortio *old_portio;
};
typedef struct CoalescedMemoryRange CoalescedMemoryRange;
@@ -92,6 +99,16 @@ struct MemoryRegion {
uint8_t dirty_log_mask;
};
+struct MemoryRegionPortio {
+ uint32_t offset;
+ uint32_t len;
+ unsigned size;
+ IOPortReadFunc *read;
+ IOPortWriteFunc *write;
+};
+
+#define PORTIO_END { }
+
/* Initialize a memory region
*
* The region typically acts as a container for other memory regions.
--
1.7.5.3
- [Qemu-devel] [RFC v4 54/58] pci: remove pci_register_bar_simple(), (continued)
- [Qemu-devel] [RFC v4 54/58] pci: remove pci_register_bar_simple(), Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 50/58] ehci: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 29/58] Integrate I/O memory regions into qemu, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 19/58] sysbus: add MemoryRegion based memory management API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 14/58] pc: grab system_memory, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 53/58] msix: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 27/58] vga: simplify vga window mmio access functions, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 26/58] cirrus: simplify vga window mmio access functions, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 34/58] ac97: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 16/58] pc: move global memory map out of pc_init1() and into its callers, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 09/58] memory: add backward compatibility for old portio registration,
Avi Kivity <=
- [Qemu-devel] [RFC v4 48/58] isa-mmio: concert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 52/58] xen-platform: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 24/58] cirrus: simplify mmio BAR access functions, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 46/58] pcnet: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 57/58] pci: fold BAR mapping function into its caller, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 21/58] pci: add API to get a BAR's mapped address, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 41/58] ahci: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 32/58] pci: allow I/O BARs to be registered with pci_register_bar_region(), Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 51/58] uhci: convert to memory API, Avi Kivity, 2011/07/17
- [Qemu-devel] [RFC v4 49/58] sun4u: convert to memory API, Avi Kivity, 2011/07/17