| plan 9 kernel history: overview | file list | diff list |
1990/06021/gnot/mmu.c (diff list | history)
| 1990/03091/sys/src/9/gnot/mmu.c:4,9 – 1990/06021/sys/src/9/gnot/mmu.c:4,17 (short | long | prev | next) | ||
| 1990/03091 | #include "dat.h" #include "fns.h" | |
| 1990/06021 | struct { Lock; int init; KMap *free; KMap arena[4*1024*1024/BY2PG]; /* kernel mmu maps up to 4MB */ }kmapalloc; | |
| 1990/03091 | /* * Called splhi, not in Running state */ | |
| 1990/03091/sys/src/9/gnot/mmu.c:45,48 – 1990/06021/sys/src/9/gnot/mmu.c:53,107 | ||
| 1990/03091 | flushcpucache(); *PARAM &= ~TLBFLUSH_; *PARAM |= TLBFLUSH_; | |
| 1990/06021 | } 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]; i<e; i++,k++){ k->va = 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); | |
| 1990/03091 | } | |