summaryrefslogtreecommitdiff
path: root/kernel/vm.c
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-07-22 13:32:33 -0400
committerFrans Kaashoek <[email protected]>2019-07-22 13:32:33 -0400
commitc5d48db0456472d4edb3ac47763b23141839ca47 (patch)
tree16b76ce07dba7d4c4b6634b0a313f848eac56d99 /kernel/vm.c
parent328204d9cc3995a44bb3cce2f5206e392a8601a7 (diff)
parent06109901c9c12733e86fb1b264dabef60655de04 (diff)
downloadxv6-labs-c5d48db0456472d4edb3ac47763b23141839ca47.tar.gz
xv6-labs-c5d48db0456472d4edb3ac47763b23141839ca47.tar.bz2
xv6-labs-c5d48db0456472d4edb3ac47763b23141839ca47.zip
Merge branch 'riscv-kstack' into riscv
Diffstat (limited to 'kernel/vm.c')
-rw-r--r--kernel/vm.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/vm.c b/kernel/vm.c
index 412ec8c..f7ca101 100644
--- a/kernel/vm.c
+++ b/kernel/vm.c
@@ -404,3 +404,35 @@ copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max)
return -1;
}
}
+
+char
+*map_kstack(uint64 kstack)
+{
+ char *k = kalloc();
+ if(k == 0) {
+ return 0;
+ }
+ if (mappages(kernel_pagetable, (uint64) kstack, PGSIZE,
+ (uint64) k, PTE_R | PTE_W) == 0) {
+ kvminithart();
+ return (char *) kstack;
+ }
+ kfree(k);
+ return 0;
+}
+
+// assumes va is page aligned
+uint64
+kernelpa(uint64 va) {
+ uint64 off = va % PGSIZE;
+ pte_t *pte;
+ uint64 pa;
+
+ pte = walk(kernel_pagetable, va, 0);
+ if(pte == 0)
+ panic("kernelpa");
+ if((*pte & PTE_V) == 0)
+ panic("kernelpa");
+ pa = PTE2PA(*pte);
+ return pa+off;
+}