kernel: simplify mmuput

This commit is contained in:
2017-05-30 22:41:44 +02:00
parent 28c426055d
commit 7108477c32

View File

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