[RFC v5 11/86] memory: add backward compatibility for old mmio registration

Avi Kivity
2011-07-20T16:50:45Z

This eases the transition to the new API.

Signed-off-by: Avi Kivity <avi@redhat.com>
---
memory.c | 10 ++++++++++
memory.h | 10 ++++++++++
2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/memory.c b/memory.c
index bb04952..e4446a0 100644
--- a/memory.c
+++ b/memory.c
@@ -14,6 +14,7 @@
#include "memory.h"
#include "exec-memory.h"
#include "ioport.h"
+#include "bitops.h"
#include <assert.h>

typedef struct AddrRange AddrRange;
@@ -499,6 +500,10 @@ static uint32_t memory_region_read_thunk_n(void *_mr,
return -1U; /* FIXME: better signalling */
}

+ if (!mr->ops->read) {
+ return mr->ops->old_mmio.read[bitops_ffsl(size)](mr->opaque, addr);
+ }
+
/* FIXME: support unaligned access */

access_size_min = mr->ops->impl.min_access_size;
@@ -535,6 +540,11 @@ static void memory_region_write_thunk_n(void *_mr,
return; /* FIXME: better signalling */
}

+ if (!mr->ops->write) {
+ mr->ops->old_mmio.write[bitops_ffsl(size)](mr->opaque, addr, data);
+ return;
+ }
+
/* FIXME: support unaligned access */

access_size_min = mr->ops->impl.min_access_size;
diff --git a/memory.h b/memory.h
index f026eae..4624946 100644
--- a/memory.h
+++ b/memory.h
@@ -15,6 +15,7 @@
typedef struct MemoryRegionOps MemoryRegionOps;
typedef struct MemoryRegion MemoryRegion;
typedef struct MemoryRegionPortio MemoryRegionPortio;
+typedef struct MemoryRegionMmio MemoryRegionMmio;

/* Must match *_DIRTY_FLAGS in cpu-all.h. To be replaced with dynamic
* registration.
@@ -23,6 +24,11 @@ typedef struct MemoryRegionPortio MemoryRegionPortio;
#define DIRTY_MEMORY_CODE 1
#define DIRTY_MEMORY_MIGRATION 3

+struct MemoryRegionMmio {
+ CPUReadMemoryFunc *read[3];
+ CPUWriteMemoryFunc *write[3];
+};
+
/*
* Memory region callbacks
*/
@@ -72,6 +78,10 @@ struct MemoryRegionOps {
* backwards compatibility with old portio registration
*/
const MemoryRegionPortio *old_portio;
+ /* If .read and .write are not present, old_mmio may be used for
+ * backwards compatibility with old mmio registration
+ */
+ const MemoryRegionMmio old_mmio;
};

typedef struct CoalescedMemoryRange CoalescedMemoryRange;
--
1.7.5.3