diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-07-06 03:23:58 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-07-06 03:23:58 -0700 |
commit | f6eff201069564ea01100d556b079f99e076dd09 (patch) | |
tree | 0b8932b0f1dd3dcf70ec86e972b91b2f97d2e5c0 /pk/mmap.c | |
parent | 8b41191ccdf19f08662e2eb674a2eddc717d5108 (diff) | |
download | pk-f6eff201069564ea01100d556b079f99e076dd09.zip pk-f6eff201069564ea01100d556b079f99e076dd09.tar.gz pk-f6eff201069564ea01100d556b079f99e076dd09.tar.bz2 |
Udpate to new PTE format
Diffstat (limited to 'pk/mmap.c')
-rw-r--r-- | pk/mmap.c | 38 |
1 files changed, 11 insertions, 27 deletions
@@ -140,31 +140,13 @@ static uintptr_t __vm_alloc(size_t npage) static inline pte_t prot_to_type(int prot, int user) { - prot &= PROT_READ|PROT_WRITE|PROT_EXEC; - if (user) { - switch (prot) { - case PROT_NONE: return PTE_TYPE_SR; - case PROT_READ: return PTE_TYPE_UR_SR; - case PROT_WRITE: return PTE_TYPE_URW_SRW; - case PROT_EXEC: return PTE_TYPE_URX_SRX; - case PROT_READ|PROT_WRITE: return PTE_TYPE_URW_SRW; - case PROT_READ|PROT_EXEC: return PTE_TYPE_URX_SRX; - case PROT_WRITE|PROT_EXEC: return PTE_TYPE_URWX_SRWX; - case PROT_READ|PROT_WRITE|PROT_EXEC: return PTE_TYPE_URWX_SRWX; - } - } else { - switch (prot) { - case PROT_NONE: - case PROT_READ: return PTE_TYPE_SR; - case PROT_WRITE: return PTE_TYPE_SRW; - case PROT_EXEC: return PTE_TYPE_SRX; - case PROT_READ|PROT_WRITE: return PTE_TYPE_SRW; - case PROT_READ|PROT_EXEC: return PTE_TYPE_SRX; - case PROT_WRITE|PROT_EXEC: return PTE_TYPE_SRWX; - case PROT_READ|PROT_WRITE|PROT_EXEC: return PTE_TYPE_SRWX; - } - } - __builtin_unreachable(); + 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 (pte == 0) pte = PTE_R; + if (user) pte |= PTE_U; + return pte; } int __valid_user_range(uintptr_t vaddr, size_t len) @@ -360,8 +342,10 @@ uintptr_t do_mprotect(uintptr_t addr, size_t length, int prot) } v->prot = prot; } else { - if (((prot & PROT_WRITE) && !PTE_UW(*pte)) - || ((prot & PROT_EXEC) && !PTE_UX(*pte))) { + if (!(*pte & PTE_U) || + ((prot & PROT_READ) && !(*pte & PTE_R)) || + ((prot & PROT_WRITE) && !(*pte & PTE_W)) || + ((prot & PROT_EXEC) && !(*pte & PTE_X))) { //TODO:look at file to find perms res = -EACCES; break; |