diff options
author | Andrew Waterman <andrew@sifive.com> | 2017-02-22 20:31:28 -0800 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2017-02-22 20:31:28 -0800 |
commit | 34979b93458d685df65a49bca3084eb8283439da (patch) | |
tree | 3c7cfa9b649f45ded8e7fabfad5e56bcd8488d39 /pk | |
parent | f6bca6e35b66632afad68f6b7fb2b3203c8502fb (diff) | |
download | pk-34979b93458d685df65a49bca3084eb8283439da.zip pk-34979b93458d685df65a49bca3084eb8283439da.tar.gz pk-34979b93458d685df65a49bca3084eb8283439da.tar.bz2 |
Fix PK boot
Diffstat (limited to 'pk')
-rw-r--r-- | pk/mmap.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -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; } |