This is helpful in the next patch to know if a rom is pointed by an alias. Signed-off-by: KONRAD Frederic <frederic.kon...@adacore.com> --- include/exec/memory.h | 10 ++++++++++ memory.c | 22 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/include/exec/memory.h b/include/exec/memory.h index 8503685..e342412 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -1270,6 +1270,16 @@ void memory_region_set_size(MemoryRegion *mr, uint64_t size); void memory_region_set_alias_offset(MemoryRegion *mr, hwaddr offset); +/* + * memory_region_get_offset_within_address_space: get the offset of a region + * + * Returns the offset of a region within its address space. @mr must be mapped + * to an #AddressSpace. + * + * @mr: the #MemoryRegion to check. + */ +hwaddr memory_region_get_offset_within_address_space(MemoryRegion *mr); + /** * memory_region_present: checks if an address relative to a @container * translates into #MemoryRegion within @container diff --git a/memory.c b/memory.c index 1044bba..2b7439b 100644 --- a/memory.c +++ b/memory.c @@ -598,11 +598,18 @@ static MemTxResult access_with_adjusted_size(hwaddr addr, return r; } -static AddressSpace *memory_region_to_address_space(MemoryRegion *mr) +static AddressSpace *memory_region_to_address_space(MemoryRegion *mr, + hwaddr *offset) { AddressSpace *as; + if (offset) { + *offset = 0; + } while (mr->container) { + if (offset) { + *offset += mr->addr; + } mr = mr->container; } QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) { @@ -613,6 +620,17 @@ static AddressSpace *memory_region_to_address_space(MemoryRegion *mr) return NULL; } +hwaddr memory_region_get_offset_within_address_space(MemoryRegion *mr) +{ + hwaddr offset; + AddressSpace *as; + + as = memory_region_to_address_space(mr, &offset); + assert(as); + + return offset; +} + /* Render a memory region into the global view. Ranges in @view obscure * ranges in @mr. */ @@ -2251,7 +2269,7 @@ static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr, addr += root->addr; } - as = memory_region_to_address_space(root); + as = memory_region_to_address_space(root, NULL); if (!as) { return ret; } -- 1.8.3.1