--- /sys/src/9k/k10/fns.h +++ /sys/src/9k/k10/fns.h @@ -76,6 +76,7 @@ void mapupainit(uvlong, ulong); int memcolor(uintmem, uintmem*); void meminit(void); void mfence(void); +void mmucachectl(Page*, uint); void mmuflushtlb(u64int); void mmuinit(void); u64int mmuphysaddr(uintptr); --- /sys/src/9k/k10/main.c +++ /sys/src/9k/k10/main.c @@ -405,7 +405,7 @@ userinit(void) s->flushme++; p->seg[TSEG] = s; pg = newpage(1, s, UTZERO, 0); - memset(pg->cachectl, PG_TXTFLUSH, sizeof(pg->cachectl)); + mmucachectl(pg, PG_TXTFLUSH); segpage(s, pg); k = kmap(s->map[0]->pages[0]); memmove(UINT2PTR(VA(k)), initcode, sizeof initcode); --- /sys/src/9k/k10/mmu.c +++ /sys/src/9k/k10/mmu.c @@ -617,6 +617,13 @@ pte[PTLX(KSEG1PML4, 3)] = m->pml4->pa|PteRW|PteP; mmuphysaddr(PTR2UINT(end)); } +void +mmucachectl(Page *p, uint why) +{ + if(!pagedout(p)) + memset(p->cachectl, why, sizeof(p->cachectl)); +} + /* * Double-check the user MMU. * Error checking only. --- /sys/src/9k/port/devproc.c +++ /sys/src/9k/port/devproc.c @@ -1612,7 +1612,7 @@ procctlmemio(Proc *p, uintptr offset, int n, void *va, int read) /* Ensure the process sees text page changes */ if(s->flushme) - memset(pg->cachectl, PG_TXTFLUSH, sizeof(pg->cachectl)); + mmucachectl(pg, PG_TXTFLUSH); s->steal--; --- /sys/src/9k/port/fault.c +++ /sys/src/9k/port/fault.c @@ -261,7 +261,7 @@ pio(Segment *s, uintptr addr, uintptr soff, Page **p) putpage(new); if(s->flushme) - memset((*p)->cachectl, PG_TXTFLUSH, sizeof((*p)->cachectl)); + mmucachectl(*p, PG_TXTFLUSH); } /* --- /sys/src/9k/port/page.c +++ /sys/src/9k/port/page.c @@ -250,8 +250,7 @@ newpage(int clear, Segment *s, uintptr va, int locked) p->ref++; p->va = va; p->modref = 0; - for(i = 0; i < MACHMAX; i++) - p->cachectl[i] = ct; + mmucachectl(p, ct); unlock(p); unlock(&palloc); --- /sys/src/9k/port/sysseg.c +++ /sys/src/9k/port/sysseg.c @@ -372,13 +372,9 @@ static void pteflush(Pte *pte, int s, int e) { int i; - Page *p; - for(i = s; i < e; i++) { - p = pte->pages[i]; - if(pagedout(p) == 0) - memset(p->cachectl, PG_TXTFLUSH, sizeof(p->cachectl)); - } + for(i = s; i < e; i++) + mmucachectl(pte->pages[i], PG_TXTFLUSH); } void