Patchwork [10/23] memory: add backward compatibility for old mmio registration

login
register
mail settings
Submitter Avi Kivity
Date July 25, 2011, 2:02 p.m.
Message ID <1311602584-23409-11-git-send-email-avi@redhat.com>
Download mbox | patch
Permalink /patch/106697/
State New
Headers show

Comments

Avi Kivity - July 25, 2011, 2:02 p.m.
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(-)
Anthony Liguori - July 25, 2011, 7:02 p.m.
On 07/25/2011 09:02 AM, Avi Kivity wrote:
> This eases the transition to the new API.
>
> Signed-off-by: Avi Kivity<avi@redhat.com>

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> ---
>   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;

Patch

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;