diff options
author | Mole Shang <[email protected]> | 2024-02-10 13:46:25 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-10 13:50:34 +0800 |
commit | 3673a2cdfb30e1e3936e695a3fb8adee74488d6b (patch) | |
tree | 282b4677f47bbb15949e24b3bfa455b173a38a29 /kernel/vm.c | |
parent | f379c1c4c80947365eb6c4046c3ab165629dc8cd (diff) | |
parent | c9284cd93525436cc823258ab309c1b27eeec714 (diff) | |
download | xv6-labs-3673a2cdfb30e1e3936e695a3fb8adee74488d6b.tar.gz xv6-labs-3673a2cdfb30e1e3936e695a3fb8adee74488d6b.tar.bz2 xv6-labs-3673a2cdfb30e1e3936e695a3fb8adee74488d6b.zip |
Merge branch 'pgtbl' into traps
Conflicts:
.gitignore
Makefile
conf/lab.mk
Diffstat (limited to 'kernel/vm.c')
-rw-r--r-- | kernel/vm.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/kernel/vm.c b/kernel/vm.c index 5c31e87..9c17fe7 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -449,3 +449,30 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) return -1; } } + +static void +walkprint(pagetable_t pgtbl, int level) +{ + for(int i = 0; i < 512; i++){ + pte_t pte = pgtbl[i]; + if(pte & PTE_V){ + for(int j = 0; j < level; j++){ + printf(" .."); + } + printf("%d: pte %p pa %p\n", i, pte, PTE2PA(pte)); + if((pte & (PTE_R|PTE_W|PTE_X)) == 0){ + // this PTE points to a lower-level page table. + walkprint((pagetable_t)PTE2PA(pte), level+1); + } + } + } +} + +// Print the contents of a page table +void +vmprint(pagetable_t pgtbl) +{ + printf("page table %p\n", pgtbl); + + walkprint(pgtbl, 1); +} |