On Tue, May 27, 2014 at 7:04 PM, Peter Crosthwaite <peter.crosthwa...@xilinx.com> wrote: > QOM propertyify the .may-overlap and .priority fields. The setters > will re-add the memory as a subregion if needed (i.e. the values change > when the memory region is already contained). > > Signed-off-by: Peter Crosthwaite <peter.crosthwa...@xilinx.com> > --- > changed since v1: > Converted priority to signed type > > include/exec/memory.h | 2 +- > memory.c | 57 > +++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 58 insertions(+), 1 deletion(-) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index 371c066..117c0d3 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -157,7 +157,7 @@ struct MemoryRegion { > bool flush_coalesced_mmio; > MemoryRegion *alias; > hwaddr alias_offset; > - int priority; > + int32_t priority; > bool may_overlap; > QTAILQ_HEAD(subregions, MemoryRegion) subregions; > QTAILQ_ENTRY(MemoryRegion) subregions_link; > diff --git a/memory.c b/memory.c > index a95bb1e..ee761a2 100644 > --- a/memory.c > +++ b/memory.c > @@ -955,6 +955,55 @@ static void memory_region_release_container(Object *obj, > const char *name, > } > } > > +static void memory_region_get_priority(Object *obj, Visitor *v, void *opaque, > + const char *name, Error **errp) > +{ > + MemoryRegion *mr = MEMORY_REGION(obj); > + Error *local_err = NULL; > + uint32_t value = mr->addr;
That's a copy paste error. Fixed. Also change type to int32_t to support signed priorities via QOM setters/getters. Regards, Peter > + > + visit_type_uint32(v, &value, name, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + } > +} > + > +static void memory_region_set_priority(Object *obj, Visitor *v, void *opaque, > + const char *name, Error **errp) > +{ > + MemoryRegion *mr = MEMORY_REGION(obj); > + Error *local_err = NULL; > + uint32_t value; > + > + visit_type_uint32(v, &value, name, &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > + return; > + } > + > + if (mr->priority != value) { > + mr->priority = value; > + memory_region_readd_subregion(mr); > + } > +} > + > +static bool memory_region_get_may_overlap(Object *obj, Error **errp) > +{ > + MemoryRegion *mr = MEMORY_REGION(obj); > + > + return mr->may_overlap; > +} > + > +static void memory_region_set_may_overlap(Object *obj, bool value, Error > **errp) > +{ > + MemoryRegion *mr = MEMORY_REGION(obj); > + > + if (mr->may_overlap != value) { > + mr->may_overlap = value; > + memory_region_readd_subregion(mr); > + } > +} > + > static void memory_region_initfn(Object *obj) > { > MemoryRegion *mr = MEMORY_REGION(obj); > @@ -980,6 +1029,14 @@ static void memory_region_initfn(Object *obj) > memory_region_get_addr, > memory_region_set_addr, > NULL, NULL, &error_abort); > + object_property_add(OBJECT(mr), "priority", "uint32", > + memory_region_get_priority, > + memory_region_set_priority, > + NULL, NULL, &error_abort); > + object_property_add_bool(OBJECT(mr), "may-overlap", > + memory_region_get_may_overlap, > + memory_region_set_may_overlap, > + &error_abort); > } > > static uint64_t unassigned_mem_read(void *opaque, hwaddr addr, > -- > 1.9.3.1.ga73a6ad >