Browse Source

fix pte_create to deal with protection bits correctly

pull/13/head
Yunsup Lee 11 years ago
parent
commit
fa1b729581
  1. 30
      pk/vm.c
  2. 1
      pk/vm.h

30
pk/vm.c

@ -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;
}

1
pk/vm.h

@ -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

Loading…
Cancel
Save