aboutsummaryrefslogtreecommitdiff
path: root/pk/mmap.c
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2017-02-22 20:31:28 -0800
committerAndrew Waterman <andrew@sifive.com>2017-02-22 20:31:28 -0800
commit34979b93458d685df65a49bca3084eb8283439da (patch)
tree3c7cfa9b649f45ded8e7fabfad5e56bcd8488d39 /pk/mmap.c
parentf6bca6e35b66632afad68f6b7fb2b3203c8502fb (diff)
downloadpk-34979b93458d685df65a49bca3084eb8283439da.zip
pk-34979b93458d685df65a49bca3084eb8283439da.tar.gz
pk-34979b93458d685df65a49bca3084eb8283439da.tar.bz2
Fix PK boot
Diffstat (limited to 'pk/mmap.c')
-rw-r--r--pk/mmap.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/pk/mmap.c b/pk/mmap.c
index 33c3da2..a063f42 100644
--- a/pk/mmap.c
+++ b/pk/mmap.c
@@ -142,9 +142,9 @@ static uintptr_t __vm_alloc(size_t npage)
static inline pte_t prot_to_type(int prot, int user)
{
pte_t pte = 0;
- if (prot & PROT_READ) pte |= PTE_R;
- if (prot & PROT_WRITE) pte |= PTE_W;
- if (prot & PROT_EXEC) pte |= PTE_X;
+ if (prot & PROT_READ) pte |= PTE_R | PTE_A;
+ if (prot & PROT_WRITE) pte |= PTE_W | PTE_D;
+ if (prot & PROT_EXEC) pte |= PTE_X | PTE_A;
if (pte == 0) pte = PTE_R;
if (user) pte |= PTE_U;
return pte;
@@ -406,6 +406,9 @@ uintptr_t pk_vm_init()
kassert(stack_bottom != (uintptr_t)-1);
current.stack_top = stack_bottom + stack_size;
+ flush_tlb();
+ write_csr(sptbr, ((uintptr_t)root_page_table >> RISCV_PGSHIFT) | SPTBR_MODE_CHOICE);
+
uintptr_t kernel_stack_top = __page_alloc() + RISCV_PGSIZE;
return kernel_stack_top;
}