diff options
author | Frans Kaashoek <[email protected]> | 2019-07-22 13:32:33 -0400 |
---|---|---|
committer | Frans Kaashoek <[email protected]> | 2019-07-22 13:32:33 -0400 |
commit | c5d48db0456472d4edb3ac47763b23141839ca47 (patch) | |
tree | 16b76ce07dba7d4c4b6634b0a313f848eac56d99 /kernel/vm.c | |
parent | 328204d9cc3995a44bb3cce2f5206e392a8601a7 (diff) | |
parent | 06109901c9c12733e86fb1b264dabef60655de04 (diff) | |
download | xv6-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.c | 32 |
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; +} |