diff options
author | Robert Morris <[email protected]> | 2019-07-23 12:17:17 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-07-23 12:17:17 -0400 |
commit | 54178ad94d758e557bfa369b7f137e2844e030e1 (patch) | |
tree | cc2446a7d55d35e30f12f26e44aef68d285bfc91 /kernel/vm.c | |
parent | 55bc96d4190e40704fb5e447cef9597b08b8f088 (diff) | |
download | xv6-labs-54178ad94d758e557bfa369b7f137e2844e030e1.tar.gz xv6-labs-54178ad94d758e557bfa369b7f137e2844e030e1.tar.bz2 xv6-labs-54178ad94d758e557bfa369b7f137e2844e030e1.zip |
simplify kernel mapping calls
Diffstat (limited to 'kernel/vm.c')
-rw-r--r-- | kernel/vm.c | 59 |
1 files changed, 26 insertions, 33 deletions
diff --git a/kernel/vm.c b/kernel/vm.c index 7dc84ba..b327b94 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -27,33 +27,26 @@ kvminit() memset(kernel_pagetable, 0, PGSIZE); // uart registers - mappages(kernel_pagetable, UART0, PGSIZE, - UART0, PTE_R | PTE_W); + kmap(UART0, UART0, PGSIZE, PTE_R | PTE_W); // virtio mmio disk interface - mappages(kernel_pagetable, VIRTIO0, PGSIZE, - VIRTIO0, PTE_R | PTE_W); + kmap(VIRTIO0, VIRTIO0, PGSIZE, PTE_R | PTE_W); // CLINT - mappages(kernel_pagetable, CLINT, 0x10000, - CLINT, PTE_R | PTE_W); + kmap(CLINT, CLINT, 0x10000, PTE_R | PTE_W); // PLIC - mappages(kernel_pagetable, PLIC, 0x4000000, - PLIC, PTE_R | PTE_W); + kmap(PLIC, PLIC, 0x400000, PTE_R | PTE_W); // map kernel text executable and read-only. - mappages(kernel_pagetable, KERNBASE, (uint64)etext-KERNBASE, - KERNBASE, PTE_R | PTE_X); + kmap(KERNBASE, KERNBASE, (uint64)etext-KERNBASE, PTE_R | PTE_X); // map kernel data and the physical RAM we'll make use of. - mappages(kernel_pagetable, (uint64)etext, PHYSTOP-(uint64)etext, - (uint64)etext, PTE_R | PTE_W); + kmap((uint64)etext, (uint64)etext, PHYSTOP-(uint64)etext, PTE_R | PTE_W); // map the trampoline for trap entry/exit to // the highest virtual address in the kernel. - mappages(kernel_pagetable, TRAMPOLINE, PGSIZE, - (uint64)trampout, PTE_R | PTE_X); + kmap(TRAMPOLINE, (uint64)trampout, PGSIZE, PTE_R | PTE_X); } // Switch h/w page table register to the kernel's page table, @@ -117,6 +110,15 @@ walkaddr(pagetable_t pagetable, uint64 va) return pa; } +// add a mapping to the kernel page table. +// only used when booting. +// does not flush TLB or enable paging. +void +kmap(uint64 va, uint64 pa, uint64 sz, int perm) +{ + if(mappages(kernel_pagetable, va, sz, pa, perm) != 0) + panic("kmap"); +} // Create PTEs for virtual addresses starting at va that refer to // physical addresses starting at pa. va and size might not @@ -405,25 +407,13 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) } } -char * -mapkstack(uint64 kstack) -{ - char *k = kalloc(); - if(k == 0) { - return 0; - } - if (mappages(kernel_pagetable, kstack, PGSIZE, - (uint64) k, PTE_R | PTE_W) == 0) { - kvminithart(); - return (char *) kstack; - } - kfree(k); - return 0; -} - -// assumes va is page aligned +// translate a kernel virtual address to +// a physical address. only needed for +// addresses on the stack. +// assumes va is page aligned. uint64 -kernelpa(uint64 va) { +kernelpa(uint64 va) +{ uint64 off = va % PGSIZE; pte_t *pte; uint64 pa; @@ -437,8 +427,11 @@ kernelpa(uint64 va) { return pa+off; } +// mark a PTE invalid for user access. +// used by exec for the user stack guard page. void -clearpteu(pagetable_t pagetable, uint64 va) { +clearpteu(pagetable_t pagetable, uint64 va) +{ pte_t *pte; pte = walk(pagetable, va, 0); |