print_kpgtbl bug fixed
This commit is contained in:
@ -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))
|
||||
|
||||
##################################################################
|
||||
|
||||
27
kernel/vm.c
27
kernel/vm.c
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user