This patch has been successfully tested. Differences are clear, without the patch:
/usr/libexec/qemu-kvm -m 4G -monitor stdio (qemu) info mtree ... memory-region: system 0000000000000000-ffffffffffffffff (prio 0, i/o): system 0000000000000000-00000000bfffffff (prio 0, ram): alias ram-below-4g @pc.ram 0000000000000000-00000000bfffffff 0000000000000000-ffffffffffffffff (prio -1, i/o): pci ... After applying the patch ./qemu/build/qemu-system-x86_64 -m 4G -monitor stdio (qemu) info mtree ... memory-region: system │ ├── 0000000000000000-ffffffffffffffff (prio 0, i/o): system │ │ ├── 0000000000000000-00000000bfffffff (prio 0, ram): alias ram-below-4g @pc.ram 0000000000000000-00000000bfffffff │ │ ├── 0000000000000000-ffffffffffffffff (prio -1, i/o): pci ... Tested-by: Mario Casquero <mcasq...@redhat.com> On Wed, Apr 30, 2025 at 11:08 AM Chao Liu <lc00...@tecorigin.com> wrote: > > Make the hierarchical relationship between nodes clearer by adding characters > > e.g. > > qemu-system-riscv64 -M virt -monitor stdio -display none > > ``` > (qemu) info mtree > ... > memory-region: system > │ ├── 0000000000000000-ffffffffffffffff (prio 0, i/o): system > │ │ ├── 0000000003000000-000000000300ffff (prio 0, i/o): gpex_ioport_window > │ │ │ └── 0000000003000000-000000000300ffff (prio 0, i/o): gpex_ioport > ... > │ │ └── 0000000400000000-00000007ffffffff (prio 0, i/o): alias ... > ``` > > Signed-off-by: Chao Liu <lc00...@tecorigin.com> > Reviewed-by: Qingze Zhao <zqz00...@tecorigin.com> > Reviewed-by: Tingjian Zhang <zhan...@tecorigin.com> > --- > system/memory.c | 36 ++++++++++++++++++++++++++++++------ > 1 file changed, 30 insertions(+), 6 deletions(-) > > diff --git a/system/memory.c b/system/memory.c > index 71434e7ad0..cf91718bcc 100644 > --- a/system/memory.c > +++ b/system/memory.c > @@ -3296,6 +3296,21 @@ typedef QTAILQ_HEAD(, MemoryRegionList) > MemoryRegionListHead; > int128_sub((size), int128_one())) : 0) > #define MTREE_INDENT " " > > +enum mtree_node_type { > + MTREE_NODE_T_INNER, > + MTREE_NODE_T_TAIL, > +}; > + > +static void mtree_print_node(enum mtree_node_type is_tail) > +{ > + qemu_printf((is_tail == MTREE_NODE_T_TAIL) ? "└── " : "├── "); > +} > + > +static void mtree_print_col(unsigned level) > +{ > + qemu_printf(level ? "│ " : "│ "); > +} > + > static void mtree_expand_owner(const char *label, Object *obj) > { > DeviceState *dev = (DeviceState *) object_dynamic_cast(obj, TYPE_DEVICE); > @@ -3335,7 +3350,8 @@ static void mtree_print_mr_owner(const MemoryRegion *mr) > static void mtree_print_mr(const MemoryRegion *mr, unsigned int level, > hwaddr base, > MemoryRegionListHead *alias_print_queue, > - bool owner, bool display_disabled) > + bool owner, bool display_disabled, > + enum mtree_node_type node_type) > { > MemoryRegionList *new_ml, *ml, *next_ml; > MemoryRegionListHead submr_print_queue; > @@ -3376,8 +3392,9 @@ static void mtree_print_mr(const MemoryRegion *mr, > unsigned int level, > } > if (mr->enabled || display_disabled) { > for (i = 0; i < level; i++) { > - qemu_printf(MTREE_INDENT); > + mtree_print_col(i); > } > + mtree_print_node(node_type); > qemu_printf(HWADDR_FMT_plx "-" HWADDR_FMT_plx > " (prio %d, %s%s): alias %s @%s " HWADDR_FMT_plx > "-" HWADDR_FMT_plx "%s", > @@ -3398,8 +3415,9 @@ static void mtree_print_mr(const MemoryRegion *mr, > unsigned int level, > } else { > if (mr->enabled || display_disabled) { > for (i = 0; i < level; i++) { > - qemu_printf(MTREE_INDENT); > + mtree_print_col(i); > } > + mtree_print_node(node_type); > qemu_printf(HWADDR_FMT_plx "-" HWADDR_FMT_plx > " (prio %d, %s%s): %s%s", > cur_start, cur_end, > @@ -3435,8 +3453,12 @@ static void mtree_print_mr(const MemoryRegion *mr, > unsigned int level, > } > > QTAILQ_FOREACH(ml, &submr_print_queue, mrqueue) { > + if (ml == QTAILQ_LAST(&submr_print_queue)) { > + node_type = MTREE_NODE_T_TAIL; > + } > mtree_print_mr(ml->mr, level + 1, cur_start, > - alias_print_queue, owner, display_disabled); > + alias_print_queue, owner, > + display_disabled, node_type); > } > > QTAILQ_FOREACH_SAFE(ml, &submr_print_queue, mrqueue, next_ml) { > @@ -3614,7 +3636,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, 0, asi->ml_head, asi->owner, asi->disabled, > + MTREE_NODE_T_INNER); > qemu_printf("\n"); > } > > @@ -3659,7 +3682,8 @@ static void mtree_info_as(bool dispatch_tree, bool > owner, bool disabled) > /* print aliased regions */ > QTAILQ_FOREACH(ml, &ml_head, mrqueue) { > qemu_printf("memory-region: %s\n", memory_region_name(ml->mr)); > - mtree_print_mr(ml->mr, 1, 0, &ml_head, owner, disabled); > + mtree_print_mr(ml->mr, 1, 0, &ml_head, owner, disabled, > + MTREE_NODE_T_INNER); > qemu_printf("\n"); > } > > -- > 2.48.1 > >