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("...")
if bad:
msg.append("unexpected lines in output")
# for r in regexps:
# msg.append(color("red", "MISSING") + " '%s'" % r)
for r in regexps:
msg.append(color("red", "MISSING") + " '%s'" % r)
raise AssertionError("\n".join(msg))
##################################################################

View File

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