summaryrefslogtreecommitdiff
path: root/kernel/vm.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-07-23 12:17:17 -0400
committerRobert Morris <[email protected]>2019-07-23 12:17:17 -0400
commit54178ad94d758e557bfa369b7f137e2844e030e1 (patch)
treecc2446a7d55d35e30f12f26e44aef68d285bfc91 /kernel/vm.c
parent55bc96d4190e40704fb5e447cef9597b08b8f088 (diff)
downloadxv6-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.c59
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);