print_kpgtbl bug fixed

This commit is contained in:
2025-05-29 20:26:55 +08:00
parent 19e38dc598
commit e12b8c1d32
2 changed files with 11 additions and 20 deletions

View File

@@ -208,8 +208,8 @@ def assert_lines_match(text, *regexps, **kw):
msg.append("...") msg.append("...")
if bad: if bad:
msg.append("unexpected lines in output") msg.append("unexpected lines in output")
# for r in regexps: for r in regexps:
# msg.append(color("red", "MISSING") + " '%s'" % r) msg.append(color("red", "MISSING") + " '%s'" % r)
raise AssertionError("\n".join(msg)) raise AssertionError("\n".join(msg))
################################################################## ##################################################################

View File

@@ -645,36 +645,27 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max)
#ifdef LAB_PGTBL #ifdef LAB_PGTBL
void vmprint(pagetable_t pagetable); void vmprint(pagetable_t pagetable);
static void print_pte_flags(pte_t pte) {
if (pte & PTE_R) printf("R");
if (pte & PTE_W) printf("W");
if (pte & PTE_X) printf("X");
if (pte & PTE_U) printf("U");
}
static void vmprint_recursive(pagetable_t pagetable, int level, uint64 va_base) { static void vmprint_recursive(pagetable_t pagetable, int level, uint64 va_base) {
for (int i = 0; i < 512; i++) { for (int i = 0; i < 512; i++) {
pte_t pte = pagetable[i]; pte_t pte = pagetable[i];
if (pte & PTE_V) { if (pte & PTE_V) {
uint64 pa = PTE2PA(pte); uint64 pa = PTE2PA(pte);
uint64 va = va_base + ((uint64)i << (12 + 9 * (2 - level)));
for (int j = 0; j < level; j++) for (int j = 0; j < level; j++)
printf(" .."); printf(" ..");
printf("%d: pte %p pa %p", i, (void*)pte, (void*)pa); if (level > 0)
printf(" ");
// 如果是叶子节点,打印 va 和 flags if (level == 0) {
if ((pte & (PTE_R | PTE_W | PTE_X)) != 0) { printf(" ..%p\n", (void*)va);
uint64 va = va_base + ((uint64)i << (9 * (2 - level))); } else {
printf(" va %p flags ", (void*)va); printf("..%p\n", (void*)va);
print_pte_flags(pte);
} }
printf("\n");
// 不是叶子节点,递归下一级页表 // 不是叶子节点,递归下一级页表
if ((pte & (PTE_R | PTE_W | PTE_X)) == 0) { if ((pte & (PTE_R | PTE_W | PTE_X)) == 0) {
vmprint_recursive((pagetable_t)pa, level + 1, vmprint_recursive((pagetable_t)pa, level + 1, va);
va_base + ((uint64)i << (9 * (2 - level))));
} }
} }
} }