Hi, Phil!

On Thu, Feb 26, 2026 at 11:02:23PM +0100, Philippe Mathieu-Daudé wrote:
> Since AddressSpace root MemoryRegion can be remapped, it is
> bogus to use the MemoryRegion address as the AddressSpace
> absolute address. Besides, the AddressSpace APIs take an
> @addr argument expecting AddressSpaces start at 0x0000.0000.

Could you share an example where a root MR can have addr!=0, and be
remapped while being the root MR of an AS?

Thanks,

> 
> Substract the MemoryRegion address in mtree_print_mr() to
> display AddressSpaces starting at 0x0000.0000.
> 
> Signed-off-by: Philippe Mathieu-Daudé <[email protected]>
> ---
>  system/memory.c | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/system/memory.c b/system/memory.c
> index d5060774834..1106f48d0d5 100644
> --- a/system/memory.c
> +++ b/system/memory.c
> @@ -3360,7 +3360,7 @@ static void mtree_print_mr_owner(const MemoryRegion *mr)
>  }
>  
>  static void mtree_print_mr(const MemoryRegion *mr, unsigned int level,
> -                           hwaddr base,
> +                           hwaddr offset, bool detect_overflow,
>                             MemoryRegionListHead *alias_print_queue,
>                             bool owner, bool display_disabled)
>  {
> @@ -3374,7 +3374,7 @@ static void mtree_print_mr(const MemoryRegion *mr, 
> unsigned int level,
>          return;
>      }
>  
> -    cur_start = base + mr->addr;
> +    cur_start = mr->addr + offset;
>      cur_end = cur_start + MR_SIZE(mr->size);
>  
>      /*
> @@ -3382,7 +3382,7 @@ static void mtree_print_mr(const MemoryRegion *mr, 
> unsigned int level,
>       * happen normally. When it happens, we dump something to warn the
>       * user who is observing this.
>       */
> -    if (cur_start < base || cur_end < cur_start) {
> +    if (detect_overflow && (cur_start < offset || cur_end < cur_start)) {
>          qemu_printf("[DETECTED OVERFLOW!] ");
>      }
>  
> @@ -3462,7 +3462,7 @@ static void mtree_print_mr(const MemoryRegion *mr, 
> unsigned int level,
>      }
>  
>      QTAILQ_FOREACH(ml, &submr_print_queue, mrqueue) {
> -        mtree_print_mr(ml->mr, level + 1, cur_start,
> +        mtree_print_mr(ml->mr, level + 1, cur_start, true,
>                         alias_print_queue, owner, display_disabled);
>      }
>  
> @@ -3641,7 +3641,8 @@ static void mtree_print_as(gpointer key, gpointer 
> value, gpointer user_data)
>      struct AddressSpaceInfo *asi = user_data;
>  
>      g_slist_foreach(as_same_root_mr_list, mtree_print_as_name, NULL);
> -    mtree_print_mr(mr, 1, 0, asi->ml_head, asi->owner, asi->disabled);
> +    mtree_print_mr(mr, 1, -mr->addr, false,
> +                   asi->ml_head, asi->owner, asi->disabled);
>      qemu_printf("\n");
>  }
>  
> @@ -3688,7 +3689,7 @@ static void mtree_info_as(bool dispatch_tree, bool 
> owner, bool disabled)
>          const MemoryRegion *mr = ml->mr;
>  
>          qemu_printf("memory-region: %s\n", memory_region_name(mr));
> -        mtree_print_mr(mr, 1, 0, &ml_head, owner, disabled);
> +        mtree_print_mr(mr, 1, 0, false, &ml_head, owner, disabled);
>          qemu_printf("\n");
>      }
>  
> -- 
> 2.52.0
> 

-- 
Peter Xu


Reply via email to