kernel: simplify mmuput
This commit is contained in:
@@ -36,6 +36,8 @@ static struct{
|
|||||||
} ptpfreelist;
|
} ptpfreelist;
|
||||||
int ptpcount;
|
int ptpcount;
|
||||||
|
|
||||||
|
#define DO_mmuptpcheck
|
||||||
|
|
||||||
#ifdef DO_mmuptpcheck
|
#ifdef DO_mmuptpcheck
|
||||||
static void mmuptpcheck(Proc*);
|
static void mmuptpcheck(Proc*);
|
||||||
#endif
|
#endif
|
||||||
@@ -232,39 +234,30 @@ void
|
|||||||
mmuput(uintptr_t va, uintptr_t pa)
|
mmuput(uintptr_t va, uintptr_t pa)
|
||||||
{
|
{
|
||||||
Mpl pl;
|
Mpl pl;
|
||||||
int l, x, tl;
|
int l, x;
|
||||||
PTE *pte, *ptp;
|
PTE *pte, *ptp, opte;
|
||||||
Ptpage *prev;
|
Ptpage *prev;
|
||||||
uint32_t attr;
|
|
||||||
|
|
||||||
tl = (PGSHFT-12)/9;
|
|
||||||
pl = splhi();
|
pl = splhi();
|
||||||
#ifdef DO_mmuptpcheck
|
for(l = 3; l > 0; l--){
|
||||||
mmuptpcheck(up);
|
|
||||||
#endif
|
|
||||||
for(l = 3; l != tl; l--){
|
|
||||||
ptp = mmuptpget(va, l);
|
ptp = mmuptpget(va, l);
|
||||||
pte = &ptp[PTLX(va,l)];
|
pte = &ptp[PTLX(va,l)];
|
||||||
if(l == tl)
|
if(l == 0 || (*pte & PteP) == 0 || (*pte & PtePS))
|
||||||
break;
|
|
||||||
if((*pte & PteP) == 0 || *pte & PtePS)
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(l != tl){
|
if(l != 0){
|
||||||
/* add missing intermediate level */
|
/* add missing intermediate level */
|
||||||
prev = m->pml4;
|
prev = m->pml4;
|
||||||
for(l = 3; l > tl; l--){
|
for(l = 3; l > 0; l--){
|
||||||
ptp = mmuptpget(va, l);
|
ptp = mmuptpget(va, l);
|
||||||
x = PTLX(va, l);
|
x = PTLX(va, l);
|
||||||
prev = makeptp(prev, l, ptp, x);
|
prev = makeptp(prev, l, ptp, x);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ptp = mmuptpget(va, tl);
|
ptp = mmuptpget(va, 0);
|
||||||
pte = &ptp[PTLX(va, tl)];
|
pte = &ptp[PTLX(va, 0)];
|
||||||
attr = 0;
|
opte = *pte;
|
||||||
if(tl > 0)
|
*pte = pa | PteU;
|
||||||
attr |= PtePS;
|
|
||||||
*pte = pa | attr | PteU;
|
|
||||||
DBG("%d mach%d: put pte %#p: %#p -> %#P\n", up->pid, m->machno, pte, va, *pte);
|
DBG("%d mach%d: put pte %#p: %#p -> %#P\n", up->pid, m->machno, pte, va, *pte);
|
||||||
|
|
||||||
/* Simple and safe: programs can either write memory or execute it.
|
/* Simple and safe: programs can either write memory or execute it.
|
||||||
@@ -273,8 +266,12 @@ mmuput(uintptr_t va, uintptr_t pa)
|
|||||||
if(pa & PteRW)
|
if(pa & PteRW)
|
||||||
*pte |= PteNX;
|
*pte |= PteNX;
|
||||||
|
|
||||||
|
#ifdef DO_mmuptpcheck
|
||||||
|
mmuptpcheck(up);
|
||||||
|
#endif
|
||||||
splx(pl);
|
splx(pl);
|
||||||
invlpg(va); /* only if old entry valid? */
|
if(opte & PTEVALID)
|
||||||
|
invlpg(va);
|
||||||
}
|
}
|
||||||
|
|
||||||
static PTE
|
static PTE
|
||||||
|
Reference in New Issue
Block a user