Add a monitor command 'info mtree' to show the memory hierarchy
much like /proc/iomem in Linux.
Signed-off-by: Blue Swirl<address@hidden>
---
i386:
memory
0000000000000000-7ffffffffffffffe : system
00000000000ec000-00000000000effff : alias pam-ram @pc.ram
00000000000ec000-00000000000effff
00000000000e8000-00000000000ebfff : alias pam-ram @pc.ram
00000000000e8000-00000000000ebfff
00000000000e4000-00000000000e7fff : alias pam-ram @pc.ram
00000000000e4000-00000000000e7fff
00000000000e0000-00000000000e3fff : alias pam-ram @pc.ram
00000000000e0000-00000000000e3fff
00000000000dc000-00000000000dffff : alias pam-ram @pc.ram
00000000000dc000-00000000000dffff
00000000000d8000-00000000000dbfff : alias pam-ram @pc.ram
00000000000d8000-00000000000dbfff
00000000000d4000-00000000000d7fff : alias pam-ram @pc.ram
00000000000d4000-00000000000d7fff
00000000000d0000-00000000000d3fff : alias pam-ram @pc.ram
00000000000d0000-00000000000d3fff
00000000000cc000-00000000000cffff : alias pam-ram @pc.ram
00000000000cc000-00000000000cffff
00000000000c8000-00000000000cbfff : alias pam-rom @pc.ram
00000000000c8000-00000000000cbfff
00000000000c4000-00000000000c7fff : alias pam-rom @pc.ram
00000000000c4000-00000000000c7fff
00000000000c0000-00000000000c3fff : alias pam-rom @pc.ram
00000000000c0000-00000000000c3fff
00000000000f0000-00000000000fffff : alias pam-rom @pc.ram
00000000000f0000-00000000000fffff
00000000000a0000-00000000000bffff : alias smram-region @pci
00000000000a0000-00000000000bffff
4000000000000000-7fffffffffffffff : alias pci-hole64 @pci
4000000000000000-7fffffffffffffff
0000000008000000-00000000ffffffff : alias pci-hole @pci
0000000008000000-00000000ffffffff
0000000000000000-0000000007ffffff : alias ram-below-4g @pc.ram
0000000000000000-0000000007ffffff
00000000fee00000-00000000feefffff : apic
pci
0000000000000000-7ffffffffffffffe : pci
00000000feba0000-00000000febbffff : e1000-mmio
00000000febf0000-00000000febf0fff : cirrus-mmio
00000000fc000000-00000000fdffffff : cirrus-pci-bar0
00000000fc000000-00000000fc7fffff : vga.vram
00000000fd000000-00000000fd3fffff : cirrus-bitblt-mmio
00000000fc000000-00000000fc7fffff : cirrus-linear-io
00000000000a0000-00000000000bffff : cirrus-lowmem-container
00000000000a0000-00000000000bffff : cirrus-low-memory
00000000000c0000-00000000000dffff : pc.rom
00000000000e0000-00000000000fffff : alias isa-bios @pc.bios
00000000fffe0000-00000000ffffffff
00000000fffe0000-00000000ffffffff : pc.bios
pc.ram
0000000000000000-0000000007ffffff : pc.ram
pc.bios
00000000fffe0000-00000000ffffffff : pc.bios
I/O
0000000000000000-000000000000ffff : io
000000000000c000-000000000000c03f : e1000-io
000000000000c040-000000000000c04f : piix-bmdma-container
000000000000c04c-000000000000c04f : bmdma
000000000000c048-000000000000c04b : piix-bmdma
000000000000c044-000000000000c047 : bmdma
000000000000c040-000000000000c043 : piix-bmdma
0000000000000cfc-0000000000000cff : pci-conf-data
0000000000000cf8-0000000000000cfb : pci-conf-idx
PPC (HEAD)
memory
00000000-fffffffe : system
800a0000-800affff : alias vga.chain4 @vga.vram 80000000-8000ffff
80880000-808fffff : macio
808e0000-808fffff : macio-nvram
808a0000-808a0fff : pmac-ide
80896000-80895fff : (null)
80893000-8089303f : alias escc-bar @escc 80013000-8001303f
80888000-80888fff : dbdma
80880000-80880fff : heathrow-pic
80800000-8080ffff : vga.rom
80000000-807fffff : vga.vram
800a0000-800bffff : vga-lowmem
80013000-8001303f : escc
fee00000-fee00fff : pci-data-idx
fec00000-fec00fff : pci-conf-idx
fe000000-fe1fffff : isa-mmio
escc
80013000-8001303f : escc
vga.vram
80000000-807fffff : vga.vram
PPC with my pci-hole patch:
memory
00000000-fffffffe : system
80013000-8001303f : escc
fee00000-fee00fff : pci-data-idx
fec00000-fec00fff : pci-conf-idx
80000000-fdffffff : alias pci-hole @pci-mmio 80000000-fdffffff
fe000000-fe1fffff : isa-mmio
pci-mmio
00000000-ffffffff : pci-mmio
000a0000-000affff : alias vga.chain4 @vga.vram 80000000-8000ffff
80880000-808fffff : macio
808e0000-808fffff : macio-nvram
808a0000-808a0fff : pmac-ide
80896000-80895fff : (null)
80893000-8089303f : alias escc-bar @escc 80013000-8001303f
80888000-80888fff : dbdma
80880000-80880fff : heathrow-pic
80800000-8080ffff : vga.rom
80000000-807fffff : vga.vram
000a0000-000bffff : vga-lowmem
escc
80013000-8001303f : escc
vga.vram
80000000-807fffff : vga.vram
Sparc64:
0000000000000000-7ffffffffffffffe : system
000001ff00000000-000001ffffffffff : pci-mmio
000001ff000a0000-000001ff000affff : alias vga.chain4 @vga.vram
0000000000800000-000000000080ffff
000001ff03000000-000001ff037fffff : isa-mmio
000001ff02000000-000001ff02ffffff : isa-mmio
000001ff01000000-000001ff0100ffff : vga.rom
000001ff00800000-000001ff00ffffff : vga.vram
000001ff00000000-000001ff000fffff : alias pci_bridge_mem
@pci_pridge_pci 0000000000000000-00000000000fffff
000001ff00000000-000001ff000fffff : alias pci_bridge_pref_mem
@pci_pridge_pci 0000000000000000-00000000000fffff
000001ff00000000-000001ff000fffff : alias pci_bridge_mem
@pci_pridge_pci 0000000000000000-00000000000fffff
000001ff00000000-000001ff000fffff : alias pci_bridge_pref_mem
@pci_pridge_pci 0000000000000000-00000000000fffff
000001ff000a0000-000001ff000bffff : vga-lowmem
000001fe02000000-000001fe0200ffff : apb-pci-ioport
000001fe01000000-000001fe01ffffff : apb-pci-config
000001fe00000000-000001fe0000ffff : apb-config
pci_pridge_pci
^
0000000000000000-7ffffffffffffffe : pci_pridge_pci
pci_pridge_pci
0000000000000000-7ffffffffffffffe : pci_pridge_pci
vga.vram
0000000000800000-0000000000ffffff : vga.vram
---
memory.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
memory.h | 2 +
monitor.c | 7 ++++
3 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/memory.c b/memory.c
index ba74435..6b33fc4 100644
--- a/memory.c
+++ b/memory.c
@@ -17,6 +17,7 @@
#include "bitops.h"
#include "kvm.h"
#include<assert.h>
+#include "monitor.h"
unsigned memory_region_transaction_depth = 0;
@@ -1256,3 +1257,103 @@ void set_system_io_map(MemoryRegion *mr)
address_space_io.root = mr;
memory_region_update_topology();
}
+
+typedef struct MemoryRegionList MemoryRegionList;
+typedef struct MemoryRegionListHead MemoryRegionListHead;
+
+struct MemoryRegionList {
+ const MemoryRegion *mr;
+ QLIST_ENTRY(MemoryRegionList) queue;
+};
+
+struct MemoryRegionListHead {
+ QLIST_HEAD(queue, MemoryRegionList) head;
+};
+
+static void mtree_print_mr(Monitor *mon, const MemoryRegion *mr,
+ unsigned int level, target_phys_addr_t base,
+ MemoryRegionListHead *print_queue)
+{
+ const MemoryRegion *submr;
+ unsigned int i;
+
+ for (i = 0; i< level; i++) {
+ monitor_printf(mon, " ");
+ }
+
+ if (mr->alias) {
+ if (print_queue) {
+ MemoryRegionList *ml;
+ bool found = false;
+
+ /* check if the alias is already in the queue */
+ QLIST_FOREACH(ml,&print_queue->head, queue) {
+ if (ml->mr == mr->alias) {
+ found = true;
+ }
+ }
+
+ if (!found) {
+ ml = g_malloc(sizeof(*ml));
+ ml->mr = mr->alias;
+ QLIST_INSERT_HEAD(&print_queue->head, ml, queue);
+ }
+ }
+ monitor_printf(mon, TARGET_FMT_plx "-" TARGET_FMT_plx " :
alias %s @%s "
+ TARGET_FMT_plx "-" TARGET_FMT_plx "\n",
+ base + mr->addr,
+ base + mr->addr + (target_phys_addr_t)mr->size - 1,
+ mr->name,
+ mr->alias->name,
+ mr->alias_offset + mr->alias->addr,
+ mr->alias_offset + mr->alias->addr +
+ (target_phys_addr_t)mr->size - 1);
+
+ } else {
+ monitor_printf(mon, TARGET_FMT_plx "-" TARGET_FMT_plx " : %s\n",
+ base + mr->addr,
+ base + mr->addr + (target_phys_addr_t)mr->size - 1,
+ mr->name);
+ }
+ QTAILQ_FOREACH(submr,&mr->subregions, subregions_link) {
+ mtree_print_mr(mon, submr, level + 1, base + mr->addr, print_queue);
+ }
+}
+
+void mtree_info(Monitor *mon)
+{
+ MemoryRegionListHead *ml_head, *ml_head2, *ml_tmp;
+ MemoryRegionList *ml, *ml2;
+
+ ml_head = g_malloc(sizeof(*ml));
+ QLIST_INIT(&ml_head->head);
+
+ monitor_printf(mon, "memory\n");
+ mtree_print_mr(mon, address_space_memory.root, 0, 0, ml_head);
+
+ ml_head2 = g_malloc(sizeof(*ml));
+
+ /* print aliased regions */
+ for (;;) {
+ QLIST_INIT(&ml_head2->head);
+
+ QLIST_FOREACH_SAFE(ml,&ml_head->head, queue, ml2) {
+ monitor_printf(mon, "%s\n", ml->mr->name);
+ mtree_print_mr(mon, ml->mr, 0, 0, ml_head2);
+ g_free(ml);
+ }
+ if (QLIST_EMPTY(&ml_head->head)) {
+ break;
+ }
+ ml_tmp = ml_head;
+ ml_head = ml_head2;
+ ml_head2 = ml_tmp;
+ }
+
+#ifdef TARGET_I386
+ monitor_printf(mon, "I/O\n");
+ mtree_print_mr(mon, address_space_io.root, 0, 0, ml_head);
+#endif
+ g_free(ml_head2);
+ g_free(ml_head);
+}
diff --git a/memory.h b/memory.h
index 06b83ae..09d8e29 100644
--- a/memory.h
+++ b/memory.h
@@ -500,6 +500,8 @@ void memory_region_transaction_begin(void);
*/
void memory_region_transaction_commit(void);
+void mtree_info(Monitor *mon);
+
#endif
#endif
diff --git a/monitor.c b/monitor.c
index 8ec2c5e..f86fff6 100644
--- a/monitor.c
+++ b/monitor.c
@@ -2978,6 +2978,13 @@ static const mon_cmd_t info_cmds[] = {
},
#endif
{
+ .name = "mtree",
+ .args_type = "",
+ .params = "",
+ .help = "show memory tree",
+ .mhandler.info = mtree_info,
+ },
+ {
.name = "jit",
.args_type = "",
.params = "",