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