diff --git a/kernel/defs.h b/kernel/defs.h index a3c962b..06a225f 100644 --- a/kernel/defs.h +++ b/kernel/defs.h @@ -173,6 +173,7 @@ uint64 walkaddr(pagetable_t, uint64); int copyout(pagetable_t, uint64, char *, uint64); int copyin(pagetable_t, char *, uint64, uint64); int copyinstr(pagetable_t, char *, uint64, uint64); +void vmprint(pagetable_t, int level); // for pgtbl-lab 2: Print a page table // plic.c void plicinit(void); diff --git a/kernel/exec.c b/kernel/exec.c index e18bbb6..8e61b69 100644 --- a/kernel/exec.c +++ b/kernel/exec.c @@ -128,6 +128,11 @@ exec(char *path, char **argv) p->trapframe->sp = sp; // initial stack pointer proc_freepagetable(oldpagetable, oldsz); + // pgtbl-lab2: Print a page table + if (p->pid == 1) { + vmprint(p->pagetable, 0); + } + return argc; // this ends up in a0, the first argument to main(argc, argv) bad: diff --git a/kernel/vm.c b/kernel/vm.c index 9f69783..0c62603 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -437,3 +437,29 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) return -1; } } + +// Created for pgtbl-lab 2: Print a page table +// Take a pagetable_t argument +// Print the contents in the certain format +void +vmprint(pagetable_t pagetable, int level) +{ + if (!level) + printf("page table %p\n", pagetable); + + // there are 2^9 = 512 PTEs in a page table. + for(int i = 0; i < 512; i++) { + pte_t pte = pagetable[i]; + if (pte & PTE_V) { + uint64 child = PTE2PA(pte); + for (int j = level+1; j > 0; j--) { + printf(" .."); + } + printf("%d: pte %p pa %p\n", i, pte, child); + if ((pte & (PTE_R|PTE_W|PTE_X)) == 0) { + // this PTE points to a lower-level page table. + vmprint((pagetable_t)child, level+1); + } + } + } +}