[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC v1 06/25] memory: MemoryRegion: Add container and addr
From: |
Peter Crosthwaite |
Subject: |
[Qemu-devel] [RFC v1 06/25] memory: MemoryRegion: Add container and addr props |
Date: |
Thu, 15 May 2014 18:53:23 -0700 |
Expose the already existing .parent and .addr fields as QOM properties.
Setting the address will cause the memory subregion adding to happen if
it has not already. If the memory region is already contained, then
change it's address as per the established memory_region_set_address()
semantics.
Signed-off-by: Peter Crosthwaite <address@hidden>
---
memory.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/memory.c b/memory.c
index a37fdd2..4a70920 100644
--- a/memory.c
+++ b/memory.c
@@ -16,6 +16,7 @@
#include "exec/memory.h"
#include "exec/address-spaces.h"
#include "exec/ioport.h"
+#include "qapi/visitor.h"
#include "qemu/bitops.h"
#include "qom/object.h"
#include "trace.h"
@@ -844,6 +845,49 @@ void memory_region_init(MemoryRegion *mr,
mr->name = g_strdup(name);
}
+static void do_memory_region_add_subregion_common(MemoryRegion *subregion);
+
+static void memory_region_get_addr(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ MemoryRegion *mr = MEMORY_REGION(obj);
+ Error *local_err = NULL;
+ uint64_t value = mr->addr;
+
+ visit_type_uint64(v, &value, name, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ }
+}
+
+static void memory_region_set_addr(Object *obj, Visitor *v, void *opaque,
+ const char *name, Error **errp)
+{
+ MemoryRegion *mr = MEMORY_REGION(obj);
+ Error *local_err = NULL;
+ uint64_t value;
+
+ visit_type_uint64(v, &value, name, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ return;
+ }
+
+ /* In an ideal world we wait until both the parent and address is set in
+ * either order, then call do_memory_region_add_subregion_common()
+ * from the latter property setter. However, as parent is just a dumb link
+ * we only support setting from the address setter. We therefore assert
+ * here that the two props are set in correct order.
+ */
+ assert(mr->parent);
+ if (!mr->contained) {
+ mr->addr = value;
+ do_memory_region_add_subregion_common(mr);
+ } else {
+ memory_region_set_address(mr, value);
+ }
+}
+
static void memory_region_initfn(Object *obj)
{
MemoryRegion *mr = MEMORY_REGION(obj);
@@ -855,6 +899,16 @@ static void memory_region_initfn(Object *obj)
QTAILQ_INIT(&mr->subregions);
memset(&mr->subregions_link, 0, sizeof mr->subregions_link);
QTAILQ_INIT(&mr->coalesced);
+
+ object_property_add_link(OBJECT(mr), "container", TYPE_MEMORY_REGION,
+ (Object **)&mr->parent,
+ object_property_allow_set_link,
+ OBJ_PROP_LINK_UNREF_ON_RELEASE,
+ &error_abort);
+ object_property_add(OBJECT(mr), "addr", "uint64",
+ memory_region_get_addr,
+ memory_region_set_addr,
+ NULL, NULL, &error_abort);
}
static uint64_t unassigned_mem_read(void *opaque, hwaddr addr,
--
1.9.3.1.ga73a6ad
- [Qemu-devel] [RFC v1 00/25] Memory and GPIO QOMification, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 01/25] qdev: Implement named GPIOs, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 02/25] memory: Simplify mr_add_subregion() if-else, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 03/25] memory: Coreify subregion add functionality, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 04/25] memory: MemoryRegion: QOMify, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 05/25] memory: MemoryRegion: Add contained flag, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 06/25] memory: MemoryRegion: Add container and addr props,
Peter Crosthwaite <=
- [Qemu-devel] [RFC v1 07/25] memory: MemoryRegion: factor out memory region re-adder, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 08/25] memory: MemoryRegion: Add may-overlap and priority props, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 09/25] memory: MemoryRegion: Add size property, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 10/25] exec: Parent root MRs to the machine, Peter Crosthwaite, 2014/05/15
- [Qemu-devel] [RFC v1 11/25] irq: Slim conversion of qemu_irq to QOM [WIP], Peter Crosthwaite, 2014/05/15