Hi Chao,
On 30/4/25 10:31, Chao Liu 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 ...
```
Nice :)
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 | 42 ++++++++++++++++++++++++++++++++++++------
1 file changed, 36 insertions(+), 6 deletions(-)
diff --git a/system/memory.c b/system/memory.c
index 71434e7ad0..3a7faeb533 100644
--- a/system/memory.c
+++ b/system/memory.c
@@ -3296,6 +3296,27 @@ 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,
+};
+
+#define PRINT_MTREE_NODE(node_type) do { \
+ if (node_type == MTREE_NODE_T_TAIL) { \
+ qemu_printf("└── "); \
+ } else { \
+ qemu_printf("├── "); \
+ } \
+} while (0)
+
+#define PRINT_MTREE_COL(level) do { \
+ if (level == 0) { \
+ qemu_printf("│ "); \
+ } else { \
+ qemu_printf("│ "); \
+ } \
+} while (0)
Prefer tiny C functions over macros (easier to maintain):
static void mtree_print_node(bool is_tail)
{
qemu_printf(is_tail ? "└── " : "├── ");
}
static void mtree_print_col(unsigned level)
{
qemu_printf(level ? "│ " : "│ ");
}