@@ -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
@@ -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;
}
This is helpful in the next patch to know if a rom is pointed by an alias. Signed-off-by: KONRAD Frederic <frederic.konrad@adacore.com> --- include/exec/memory.h | 10 ++++++++++ memory.c | 22 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-)