## diffname gnot/mmu.c 1990/03091 ## diff -e /dev/null /n/bootesdump/1990/03091/sys/src/9/68020/mmu.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" /* * Called splhi, not in Running state */ void mapstack(Proc *p) { ulong tlbvirt, tlbphys; if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); tlbvirt = USERADDR; tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; putkmmu(tlbvirt, tlbphys); flushmmu(); u = (User*)USERADDR; } void putkmmu(ulong tlbvirt, ulong tlbphys) { if(!(tlbvirt&KZERO)) panic("putkmmu"); tlbvirt &= ~KZERO; KMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; } void putmmu(ulong tlbvirt, ulong tlbphys) { if(tlbvirt&KZERO) panic("putmmu"); tlbphys |= VTAG(tlbvirt)<<24; UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; } void flushmmu(void) { flushcpucache(); *PARAM &= ~TLBFLUSH_; *PARAM |= TLBFLUSH_; } . ## diffname gnot/mmu.c 1990/06021 ## diff -e /n/bootesdump/1990/03091/sys/src/9/68020/mmu.c /n/bootesdump/1990/06021/sys/src/9/68020/mmu.c 47a } void kmapinit(void) { KMap *k; int i, e; if(kmapalloc.init == 0){ k = &kmapalloc.arena[0]; k->va = KZERO|(3*1024*1024); k->next = 0; kmapalloc.free = k; kmapalloc.init = 1; return; } e = (4*1024*1024 - 256*1024)/BY2PG; /* screen lives at top 256K */ i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; print("kmapinit %d", i); kmapalloc.free = 0; for(k=&kmapalloc.arena[i]; iva = i*BY2PG|KZERO; kunmap(k); } } KMap* kmap(Page *pg) { KMap *k; lock(&kmapalloc); k = kmapalloc.free; if(k == 0) panic("kmap"); kmapalloc.free = k->next; unlock(&kmapalloc); k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); return k; } void kunmap(KMap *k) { k->pa = 0; lock(&kmapalloc); k->next = kmapalloc.free; kmapalloc.free = k; putkmmu(k->va, INVALIDPTE); unlock(&kmapalloc); . 6a struct { Lock; int init; KMap *free; KMap arena[4*1024*1024/BY2PG]; /* kernel mmu maps up to 4MB */ }kmapalloc; . ## diffname gnot/mmu.c 1990/0603 ## diff -e /n/bootesdump/1990/06021/sys/src/9/68020/mmu.c /n/bootesdump/1990/0603/sys/src/9/68020/mmu.c 74d ## diffname gnot/mmu.c 1990/0709 ## diff -e /n/bootesdump/1990/0603/sys/src/9/68020/mmu.c /n/bootesdump/1990/0709/sys/src/9/68020/mmu.c 89a } . 88c if(k == 0){ dumpstack(); . 73a print("%lud free map registers\n", e-i); . 66c k->va = KZERO|(4*1024*1024-256*1024-BY2PG); . ## diffname gnot/mmu.c 1990/0921 ## diff -e /n/bootesdump/1990/0709/sys/src/9/68020/mmu.c /n/bootesdump/1990/0921/sys/src/9/68020/mmu.c 55a } void flushmmucache(void) { if(u == 0) panic("flushmmucache"); u->mc.next = 0; } void clearmmucache(void) { if(u == 0) panic("clearmmucache"); memset(&u->mc, 0, sizeof u->mc); . 45a if(u){ MMU *mp; mp = &(u->mc.mmu[u->mc.next&(NMMU-1)]); mp->pa = tlbphys; mp->va = tlbvirt; mp->pid = u->p->pid; u->mc.next++; }/**/ . 29a if(u->mc.next >= NMMU){ u->mc.next &= NMMU - 1; for(i = u->mc.next; i < NMMU; i++) putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); } for(i = 0; i < u->mc.next; i++) putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid);/**/ . 21a ulong i; . 14a void putxmmu(ulong tlbvirt, ulong tlbphys, int pid) { if(pid != u->p->pid) panic("putxmmu %ld %ld\n", pid, u->p->pid); if(tlbvirt&KZERO) panic("putmmu"); tlbphys |= VTAG(tlbvirt)<<24; UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; } . ## diffname gnot/mmu.c 1990/0925 ## diff -e /n/bootesdump/1990/0921/sys/src/9/68020/mmu.c /n/bootesdump/1990/0925/sys/src/9/68020/mmu.c 92,99d 87c clearmmucache(void) . 73c } . 49c putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); . 42a /* * preload the MMU with the last (up to) NMMU user entries * previously faulted into it for this process. */ . ## diffname gnot/mmu.c 1990/0928 ## diff -e /n/bootesdump/1990/0925/sys/src/9/68020/mmu.c /n/bootesdump/1990/0928/sys/src/9/68020/mmu.c 88,95d 70,77d 42,53d 15,25d ## diffname gnot/mmu.c 1990/1004 ## diff -e /n/bootesdump/1990/0928/sys/src/9/68020/mmu.c /n/bootesdump/1990/1004/sys/src/9/68020/mmu.c 56a } void clearmmucache(void) { if(u == 0) panic("flushmmucache"); u->mc.next = 0; . 48c tlbvirt = (tlbvirt&0x003FE000L)>>2; if(u){ MMU *mp; int s; s = splhi(); mp = &(u->mc.mmu[u->mc.next&(NMMU-1)]); mp->pa = tlbphys; mp->va = tlbvirt; u->mc.next++; splx(s); } UMAP[tlbvirt] = tlbphys; . 29,30c /* * if not a kernel process and this process was not the * last process on this machine, flush & preload mmu */ if(!p->kp && p!=m->lproc){ flushmmu(); /* * preload the MMU with the last (up to) NMMU user entries * previously faulted into it for this process. */ mn = &u->mc.mmu[u->mc.next&(NMMU-1)]; me = &u->mc.mmu[NMMU]; if(u->mc.next >= NMMU){ for(mm = mn; mm < me; mm++) UMAP[mm->va] = mm->pa; } for(mm = u->mc.mmu; mm < mn; mm++) UMAP[mm->va] = mm->pa; m->lproc = p; } . 22c ulong next; MMU *mm, *mn, *me; . ## diffname gnot/mmu.c 1990/1211 ## diff -e /n/bootesdump/1990/1004/sys/src/9/68020/mmu.c /n/bootesdump/1990/1211/sys/src/9/68020/mmu.c 151a } void invalidateu(void) { putkmmu(USERADDR, INVALIDPTE); . 29a u = (User*)USERADDR; . ## diffname gnot/mmu.c 1991/0507 ## diff -e /n/bootesdump/1991/0201/sys/src/9/68020/mmu.c /n/bootesdump/1991/0507/sys/src/9/gnot/mmu.c 56a mmurelease(Proc *p) { USED(p); } void . ## diffname gnot/mmu.c 1991/0705 ## diff -e /n/bootesdump/1991/0507/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0705/sys/src/9/gnot/mmu.c 104c panic("clearmmucache"); . 72c putmmu(ulong tlbvirt, ulong tlbphys, Page *p) . 31a if(p->newtlb) { flushmmu(); clearmmucache(); p->newtlb = 0; } . 24a . ## diffname gnot/mmu.c 1991/0802 ## diff -e /n/bootesdump/1991/0705/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0802/sys/src/9/gnot/mmu.c 130c i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; . ## diffname gnot/mmu.c 1991/0817 ## diff -e /n/bootesdump/1991/0802/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0817/sys/src/9/gnot/mmu.c 153a if(u && u->p) u->p->state = s; . 143a if(u && u->p){ s = u->p->state; u->p->state = MMUing; } . 142a int s; . ## diffname gnot/mmu.c 1991/0821 ## diff -e /n/bootesdump/1991/0817/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0821/sys/src/9/gnot/mmu.c 171d 167a putkmmu(k->va, INVALIDPTE); . 159,160d 156a . 145,148d 143d 131a . 130a . 129c e = (MB4 - 256*1024)/BY2PG; /* screen lives at top 256K */ . 123c k->va = KZERO|(MB4-256*1024-BY2PG); . 12c KMap arena[MB4/BY2PG]; /* kernel mmu maps up to 4MB */ . ## diffname gnot/mmu.c 1991/0827 ## diff -e /n/bootesdump/1991/0821/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0827/sys/src/9/gnot/mmu.c 170a splx(s); . 166a s = splhi(); . 163a int s; . 154a splx(s); . 146a s = splhi(); . 145a int s; . ## diffname gnot/mmu.c 1991/0828 ## diff -e /n/bootesdump/1991/0827/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0828/sys/src/9/gnot/mmu.c 160a if(s) u->p->state = s; . 157d 148c if(u) { s = u->p->state; u->p->state = MMUing; } . 146c int s = 0; . ## diffname gnot/mmu.c 1991/0926 ## diff -e /n/bootesdump/1991/0828/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0926/sys/src/9/gnot/mmu.c 164,165d 146,151d ## diffname gnot/mmu.c 1991/0928 ## diff -e /n/bootesdump/1991/0926/sys/src/9/gnot/mmu.c /n/bootesdump/1991/0928/sys/src/9/gnot/mmu.c 26c if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0) . ## diffname gnot/mmu.c 1991/1004 ## diff -e /n/bootesdump/1991/0928/sys/src/9/gnot/mmu.c /n/bootesdump/1991/1004/sys/src/9/gnot/mmu.c 154a splx(s); . 146c int s; s = splhi(); . ## diffname gnot/mmu.c 1992/0103 ## diff -e /n/bootesdump/1991/1004/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0103/sys/src/9/gnot/mmu.c 105,112d 85,95d 45,58d 35d ## diffname gnot/mmu.c 1992/0315 ## diff -e /n/bootesdump/1992/0103/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0315/sys/src/9/gnot/mmu.c 97c i = PGROUND(palloc.addr0)/BY2PG; . ## diffname gnot/mmu.c 1992/0321 ## diff -e /n/bootesdump/1992/0315/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0321/sys/src/9/gnot/mmu.c 2c #include "../port/lib.h" . ## diffname gnot/mmu.c 1992/0622 ## diff -e /n/bootesdump/1992/0321/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0622/sys/src/9/gnot/mmu.c 104c kunmap(k++); . 102c for(k=&kmapalloc.arena[i]; i < e; i++){ . ## diffname gnot/mmu.c 1992/0625 ## diff -e /n/bootesdump/1992/0622/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0625/sys/src/9/gnot/mmu.c 105a print("%lud free map registers\n", i); . 96,104c i = 0; /* Reclaim map register for pages in bank0 */ for(p = palloc.head; p; p = p->next) { if(p->pa < MB4) { k = &kmapalloc.arena[p->pa/BY2PG]; k->va = p->pa|KZERO; kunmap(k); i++; } . 85d 83a int i; Page *p; . ## diffname gnot/mmu.c 1992/0630 ## diff -e /n/bootesdump/1992/0625/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0630/sys/src/9/gnot/mmu.c 100c if(p->pa >= endscreen && p->pa < MB4) { . 98c /* * Reclaim map register for pages in bank0; * screen is in virtual space overlaying physical pages; be careful */ endscreen = (PGROUND((ulong)end)&~KZERO) + 256*1024; . 90c k->va = KZERO|(MB4-BY2PG); . 84a ulong endscreen; . ## diffname gnot/mmu.c 1992/0711 ## diff -e /n/bootesdump/1992/0630/sys/src/9/gnot/mmu.c /n/bootesdump/1992/0711/sys/src/9/gnot/mmu.c 65a USED(pg); . 64c putmmu(ulong tlbvirt, ulong tlbphys, Page *pg) . 22,23d ## diffname gnot/mmu.c 1993/0501 # deleted ## diff -e /n/bootesdump/1992/0711/sys/src/9/gnot/mmu.c /n/fornaxdump/1993/0501/sys/src/brazil/gnot/mmu.c 1,157d