On Thu, Feb 26, 2026 at 11:02:25PM +0100, Philippe Mathieu-Daudé wrote: > Use the size of a MR / AS to decide how many address chars > need to be used. > > For example, using 'qemu-system-x86_64 -M q35 -S -monitor stdio' > to run 'info mtree' displays before: > > address-space: I/O > 0000000000000000-000000000000ffff (prio 0, i/o): io > 0000000000000000-0000000000000003 (prio 0, i/o): acpi-evt > 0000000000000004-0000000000000005 (prio 0, i/o): acpi-cnt > 0000000000000008-000000000000000b (prio 0, i/o): acpi-tmr > 0000000000000020-000000000000002f (prio 0, i/o): acpi-gpe0 > 0000000000000030-0000000000000037 (prio 0, i/o): acpi-smi > 0000000000000060-000000000000007f (prio 0, i/o): sm-tco > 0000000000000000-0000000000000007 (prio 0, i/o): dma-chan > 0000000000000008-000000000000000f (prio 0, i/o): dma-cont > 0000000000000020-0000000000000021 (prio 0, i/o): pic > 0000000000000040-0000000000000043 (prio 0, i/o): pit > ... > memory-region: pc.ram > 0000000000000000-0000000007ffffff (prio 0, ram): pc.ram > memory-region: pc.bios > 00000000fffc0000-00000000ffffffff (prio 0, rom): pc.bios > memory-region: pci > 0000000000000000-ffffffffffffffff (prio -1, i/o): pci > 00000000000a0000-00000000000bffff (prio 1, i/o): vga-lowmem > 00000000000c0000-00000000000dffff (prio 1, rom): pc.rom > 00000000000e0000-00000000000fffff (prio 1, rom): alias isa-bios > @pc.bios 0000000000020000-000000000003ffff > 00000000fffc0000-00000000ffffffff (prio 0, rom): pc.bios > ... > > and after: > > address-space: I/O > 0000-ffff (prio 0, container): io > 0000-0003 (prio 0, i/o): acpi-evt > 0004-0005 (prio 0, i/o): acpi-cnt > 0008-000b (prio 0, i/o): acpi-tmr > 0020-002f (prio 0, i/o): acpi-gpe0 > 0030-0037 (prio 0, i/o): acpi-smi > 0060-007f (prio 0, i/o): sm-tco > 0000-0007 (prio 0, i/o): dma-chan > 0008-000f (prio 0, i/o): dma-cont > 0020-0021 (prio 0, i/o): pic > 0040-0043 (prio 0, i/o): pit > ... > memory-region: pc.ram > 00000000-07ffffff (prio 0, ram): pc.ram > memory-region: pc.bios > fffc0000-ffffffff (prio 0, rom): pc.bios > memory-region: pci > 0000000000000000-ffffffffffffffff (prio -1, i/o): pci > 00000000000a0000-00000000000bffff (prio 1, i/o): vga-lowmem > 00000000000c0000-00000000000dffff (prio 1, rom): pc.rom > 00000000000e0000-00000000000fffff (prio 1, rom): alias isa-bios > @pc.bios 0000000000020000-000000000003ffff > 00000000fffc0000-00000000ffffffff (prio 0, rom): pc.bios > ... > > Signed-off-by: Philippe Mathieu-Daudé <[email protected]> > --- > system/memory.c | 27 +++++++++++++++++++++++---- > 1 file changed, 23 insertions(+), 4 deletions(-) > > diff --git a/system/memory.c b/system/memory.c > index 4d276307da5..abcbdaadcd7 100644 > --- a/system/memory.c > +++ b/system/memory.c > @@ -3321,7 +3321,26 @@ typedef QTAILQ_HEAD(, MemoryRegionList) > MemoryRegionListHead; > > #define MR_SIZE(size) (int128_nz(size) ? (hwaddr)int128_get64( \ > int128_sub((size), int128_one())) : 0) > -#define MR_ADDR_WIDTH 16 > + > +static unsigned mr_addr_fmt_width(const MemoryRegion *mr) > +{ > + const unsigned int bits = 127 - clz128(mr->size); > + unsigned int width; > + > + if (bits <= 8) { > + width = 2; > + } else if (bits <= 16) { > + width = 4; > + } else if (bits <= 32) { > + width = 8; > + } else if (bits <= 64) { > + width = 16; > + } else { > + width = 20;
Is there any case this can happen? I thought we don't have MR larger than 1<<64. Not a huge deal, though. Reviewed-by: Peter Xu <[email protected]> > + } > + return width; > +} > + > #define MTREE_INDENT " " > > static void mtree_expand_owner(const char *label, Object *obj) > @@ -3513,7 +3532,7 @@ static void mtree_print_flatview(gpointer key, gpointer > value, > return; > } > > - width = MR_ADDR_WIDTH; > + width = mr_addr_fmt_width(view->root); > while (n--) { > const MemoryRegion *mr = range->mr; > > @@ -3643,7 +3662,7 @@ static void mtree_print_as(gpointer key, gpointer > value, gpointer user_data) > MemoryRegion *mr = key; > GSList *as_same_root_mr_list = value; > struct AddressSpaceInfo *asi = user_data; > - const unsigned int width = MR_ADDR_WIDTH; > + const unsigned int width = mr_addr_fmt_width(mr); > > g_slist_foreach(as_same_root_mr_list, mtree_print_as_name, NULL); > mtree_print_mr(mr, 1, width, -mr->addr, false, > @@ -3692,7 +3711,7 @@ static void mtree_info_as(bool dispatch_tree, bool > owner, bool disabled) > /* print aliased regions */ > QTAILQ_FOREACH(ml, &ml_head, mrqueue) { > const MemoryRegion *mr = ml->mr; > - const unsigned int width = MR_ADDR_WIDTH; > + const unsigned int width = mr_addr_fmt_width(mr); > > qemu_printf("memory-region: %s\n", memory_region_name(mr)); > mtree_print_mr(mr, 1, width, 0, false, &ml_head, owner, disabled); > -- > 2.52.0 > -- Peter Xu
