diff options
-rw-r--r-- | pk/vm.c | 30 | ||||
-rw-r--r-- | pk/vm.h | 1 |
2 files changed, 25 insertions, 6 deletions
@@ -79,12 +79,30 @@ static pte_t ptd_create(uintptr_t ppn) static inline pte_t pte_create(uintptr_t ppn, int prot, int user) { pte_t pte = (ppn << PTE_PPN_SHIFT) | PTE_V; - if (prot & PROT_WRITE) - pte |= PTE_TYPE_URW_SRW; - if (prot & PROT_EXEC) - pte |= PTE_TYPE_URX_SRX; - if (!user) - pte |= PTE_TYPE_SR; + prot &= PROT_READ|PROT_WRITE|PROT_EXEC; + if (user) { + switch (prot) { + case PROT_NONE: pte |= PTE_TYPE_SR; break; + case PROT_READ: pte |= PTE_TYPE_UR_SR; break; + case PROT_WRITE: pte |= PTE_TYPE_URW_SRW; break; + case PROT_EXEC: pte |= PTE_TYPE_URX_SRX; break; + case PROT_READ|PROT_WRITE: pte |= PTE_TYPE_URW_SRW; break; + case PROT_READ|PROT_EXEC: pte |= PTE_TYPE_URX_SRX; break; + case PROT_WRITE|PROT_EXEC: pte |= PTE_TYPE_URWX_SRWX; break; + case PROT_READ|PROT_WRITE|PROT_EXEC: pte |= PTE_TYPE_URWX_SRWX; break; + } + } else { + switch (prot) { + case PROT_NONE: kassert(0); break; + case PROT_READ: pte |= PTE_TYPE_SR; break; + case PROT_WRITE: pte |= PTE_TYPE_SRW; break; + case PROT_EXEC: pte |= PTE_TYPE_SRX; break; + case PROT_READ|PROT_WRITE: pte |= PTE_TYPE_SRW; break; + case PROT_READ|PROT_EXEC: pte |= PTE_TYPE_SRX; break; + case PROT_WRITE|PROT_EXEC: pte |= PTE_TYPE_SRWX; break; + case PROT_READ|PROT_WRITE|PROT_EXEC: pte |= PTE_TYPE_SRWX; break; + } + } return pte; } @@ -17,6 +17,7 @@ # define VA_BITS 32 #endif +#define PROT_NONE 0 #define PROT_READ 1 #define PROT_WRITE 2 #define PROT_EXEC 4 |