Hi Alex, On Wednesday, 2020-10-21 at 17:09:07 -04, Alexander Bulekov wrote: > Acked-by: Paolo Bonzini <pbonz...@redhat.com> > Signed-off-by: Alexander Bulekov <alx...@bu.edu> > --- > include/exec/memory.h | 5 +++++ > softmmu/memory.c | 9 +++++++++ > 2 files changed, 14 insertions(+) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index 622207bde1..042918dd16 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -719,6 +719,11 @@ static inline FlatView > *address_space_to_flatview(AddressSpace *as) > return qatomic_rcu_read(&as->current_map); > } > > +typedef int (*flatview_cb)(Int128 start, > + Int128 len, > + const MemoryRegion*, void*); > + > +void flatview_for_each_range(FlatView *fv, flatview_cb cb , void *opaque); > > /** > * struct MemoryRegionSection: describes a fragment of a #MemoryRegion > diff --git a/softmmu/memory.c b/softmmu/memory.c > index 403ff3abc9..c46b0c6d65 100644 > --- a/softmmu/memory.c > +++ b/softmmu/memory.c > @@ -656,6 +656,15 @@ static void render_memory_region(FlatView *view, > } > } > > +void flatview_for_each_range(FlatView *fv, flatview_cb cb , void *opaque) > +{ > + FlatRange *fr;
Just to be complete, you probably should check that both fv and cb are not NULL here - if not using an explicit if/return, at least with assertions just in case a developer does something silly... > + FOR_EACH_FLAT_RANGE(fr, fv) { > + if (cb(fr->addr.start, fr->addr.size, fr->mr, opaque)) > + break; > + } > +} > + > static MemoryRegion *memory_region_get_flatview_root(MemoryRegion *mr) > { > while (mr->enabled) { Otherwise, all looks good, so: Reviewed-by: Darren Kenny <darren.ke...@oracle.com> Thanks, Darren.