kernel/vm_page: add vm_page table dump debugger command

Change-Id: I493228736f90f5e248f1d4fa3e354beb186546cb
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4308
Reviewed-by: Alex von Gluck IV <kallisti5@unixzen.com>
(cherry picked from commit 3517616b392e7129c7c44568b033159aba92b965)
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4337
This commit is contained in:
X512 2021-07-26 02:52:02 +09:00 committed by Alex von Gluck IV
parent dd5aabaaed
commit 8761e3caab

View File

@ -760,6 +760,63 @@ private:
#endif // VM_PAGE_ALLOCATION_TRACKING_AVAILABLE
static void
list_page(vm_page* page)
{
kprintf("0x%08" B_PRIxADDR " ",
(addr_t)(page->physical_page_number * B_PAGE_SIZE));
switch (page->State()) {
case PAGE_STATE_ACTIVE: kprintf("A"); break;
case PAGE_STATE_INACTIVE: kprintf("I"); break;
case PAGE_STATE_MODIFIED: kprintf("M"); break;
case PAGE_STATE_CACHED: kprintf("C"); break;
case PAGE_STATE_FREE: kprintf("F"); break;
case PAGE_STATE_CLEAR: kprintf("L"); break;
case PAGE_STATE_WIRED: kprintf("W"); break;
case PAGE_STATE_UNUSED: kprintf("-"); break;
}
kprintf(" ");
if (page->busy) kprintf("B"); else kprintf("-");
if (page->busy_writing) kprintf("W"); else kprintf("-");
if (page->accessed) kprintf("A"); else kprintf("-");
if (page->modified) kprintf("M"); else kprintf("-");
if (page->unused) kprintf("U"); else kprintf("-");
kprintf(" usage:%3u", page->usage_count);
kprintf(" wired:%5u", page->WiredCount());
bool first = true;
vm_page_mappings::Iterator iterator = page->mappings.GetIterator();
vm_page_mapping* mapping;
while ((mapping = iterator.Next()) != NULL) {
if (first) {
kprintf(": ");
first = false;
} else
kprintf(", ");
kprintf("%" B_PRId32 " (%s)", mapping->area->id, mapping->area->name);
mapping = mapping->page_link.next;
}
}
static int
dump_page_list(int argc, char **argv)
{
kprintf("page table:\n");
for (page_num_t i = 0; i < sNumPages; i++) {
if (sPages[i].State() != PAGE_STATE_UNUSED) {
list_page(&sPages[i]);
kprintf("\n");
}
}
kprintf("end of page table\n");
return 0;
}
static int
find_page(int argc, char **argv)
{
@ -836,7 +893,7 @@ page_state_to_string(int state)
static int
dump_page(int argc, char **argv)
dump_page_long(int argc, char **argv)
{
bool addressIsPointer = true;
bool physical = false;
@ -3347,9 +3404,11 @@ vm_page_init_post_area(kernel_args *args)
PAGE_ALIGN(sNumPages * sizeof(vm_page)), B_ALREADY_WIRED,
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA);
add_debugger_command("list_pages", &dump_page_list,
"List physical pages");
add_debugger_command("page_stats", &dump_page_stats,
"Dump statistics about page usage");
add_debugger_command_etc("page", &dump_page,
add_debugger_command_etc("page", &dump_page_long,
"Dump page info",
"[ \"-p\" | \"-v\" ] [ \"-m\" ] <address>\n"
"Prints information for the physical page. If neither \"-p\" nor\n"