From 56c68782589c4264931f88fe386d83cc3fa12db4 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 28 May 2024 17:04:18 -0400 Subject: [PATCH] kernel/vm: Add sanity check for page_num in "page" KDL command. On some rare memory-corruption KDLs, I have seen pages with "0" for all fields including page_num. So now we compute the expected page number from the page's offset into sPages and print an additional line if it doesn't match what's in the page structure. --- src/system/kernel/vm/vm_page.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/vm/vm_page.cpp b/src/system/kernel/vm/vm_page.cpp index 880b204bdc..51e41285b2 100644 --- a/src/system/kernel/vm/vm_page.cpp +++ b/src/system/kernel/vm/vm_page.cpp @@ -955,11 +955,14 @@ dump_page_long(int argc, char **argv) page = vm_lookup_page(pageAddress / B_PAGE_SIZE); } + const page_num_t expected = sPhysicalPageOffset + (page - sPages); + kprintf("PAGE: %p\n", page); kprintf("queue_next,prev: %p, %p\n", page->queue_link.next, page->queue_link.previous); - kprintf("physical_number: %#" B_PRIxPHYSADDR "\n", - page->physical_page_number); + kprintf("physical_number: %#" B_PRIxPHYSADDR "\n", page->physical_page_number); + if (page->physical_page_number != expected) + kprintf("\t(expected %#" B_PRIxSIZE ")!\n", expected); kprintf("cache: %p\n", page->Cache()); kprintf("cache_offset: %" B_PRIuPHYSADDR "\n", page->cache_offset); kprintf("cache_next: %p\n", page->cache_next);