| plan 9 kernel history: overview | file list | diff list |
1991/0817/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) | ||
| 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 | } | |
| 1990/06021/sys/src/9/gnot/mmu.c:71,77 – 1990/0603/sys/src/9/gnot/mmu.c:71,76 (short | long) | ||
| 1990/06021 | } e = (4*1024*1024 - 256*1024)/BY2PG; /* screen lives at top 256K */ i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; | |
| 1990/0603/sys/src/9/gnot/mmu.c:63,69 – 1990/0709/sys/src/9/gnot/mmu.c:63,69 (short | long) | ||
| 1990/06021 | if(kmapalloc.init == 0){ k = &kmapalloc.arena[0]; | |
| 1990/0709 | k->va = KZERO|(4*1024*1024-256*1024-BY2PG); | |
| 1990/06021 | k->next = 0; kmapalloc.free = k; kmapalloc.init = 1; | |
| 1990/0603/sys/src/9/gnot/mmu.c:71,76 – 1990/0709/sys/src/9/gnot/mmu.c:71,77 | ||
| 1990/06021 | } e = (4*1024*1024 - 256*1024)/BY2PG; /* screen lives at top 256K */ i = (((ulong)ialloc(0, 0))&~KZERO)/BY2PG; | |
| 1990/0709 | print("%lud free map registers\n", e-i); | |
| 1990/06021 | kmapalloc.free = 0; for(k=&kmapalloc.arena[i]; i<e; i++,k++){ k->va = i*BY2PG|KZERO; | |
| 1990/0603/sys/src/9/gnot/mmu.c:85,92 – 1990/0709/sys/src/9/gnot/mmu.c:86,95 | ||
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1990/0709 | if(k == 0){ dumpstack(); | |
| 1990/06021 | panic("kmap"); | |
| 1990/0709 | } | |
| 1990/06021 | kmapalloc.free = k->next; unlock(&kmapalloc); k->pa = pg->pa; | |
| 1990/0709/sys/src/9/gnot/mmu.c:12,17 – 1990/0921/sys/src/9/gnot/mmu.c:12,28 (short | long) | ||
| 1990/06021 | KMap arena[4*1024*1024/BY2PG]; /* kernel mmu maps up to 4MB */ }kmapalloc; | |
| 1990/0921 | 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; } | |
| 1990/03091 | /* * Called splhi, not in Running state */ | |
| 1990/0709/sys/src/9/gnot/mmu.c:19,24 – 1990/0921/sys/src/9/gnot/mmu.c:30,36 | ||
| 1990/03091 | mapstack(Proc *p) { ulong tlbvirt, tlbphys; | |
| 1990/0921 | ulong i; | |
| 1990/03091 | if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); | |
| 1990/0709/sys/src/9/gnot/mmu.c:27,32 – 1990/0921/sys/src/9/gnot/mmu.c:39,52 | ||
| 1990/03091 | putkmmu(tlbvirt, tlbphys); flushmmu(); u = (User*)USERADDR; | |
| 1990/0921 | 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);/**/ | |
| 1990/03091 | } void | |
| 1990/0709/sys/src/9/gnot/mmu.c:43,48 – 1990/0921/sys/src/9/gnot/mmu.c:63,76 | ||
| 1990/03091 | { if(tlbvirt&KZERO) panic("putmmu"); | |
| 1990/0921 | 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++; }/**/ | |
| 1990/03091 | tlbphys |= VTAG(tlbvirt)<<24; UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; } | |
| 1990/0709/sys/src/9/gnot/mmu.c:53,58 – 1990/0921/sys/src/9/gnot/mmu.c:81,102 | ||
| 1990/03091 | flushcpucache(); *PARAM &= ~TLBFLUSH_; *PARAM |= TLBFLUSH_; | |
| 1990/0921 | } 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); | |
| 1990/06021 | } void | |
| 1990/0921/sys/src/9/gnot/mmu.c:40,45 – 1990/0925/sys/src/9/gnot/mmu.c:40,49 (short | long) | ||
| 1990/03091 | flushmmu(); u = (User*)USERADDR; | |
| 1990/0921 | ||
| 1990/0925 | /* * preload the MMU with the last (up to) NMMU user entries * previously faulted into it for this process. */ | |
| 1990/0921 | if(u->mc.next >= NMMU){ u->mc.next &= NMMU - 1; for(i = u->mc.next; i < NMMU; i++) | |
| 1990/0921/sys/src/9/gnot/mmu.c:46,52 – 1990/0925/sys/src/9/gnot/mmu.c:50,56 | ||
| 1990/0921 | putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); } for(i = 0; i < u->mc.next; i++) | |
| 1990/0925 | putxmmu(u->mc.mmu[i].va, u->mc.mmu[i].pa, u->mc.mmu[i].pid); | |
| 1990/03091 | } void | |
| 1990/0921/sys/src/9/gnot/mmu.c:70,76 – 1990/0925/sys/src/9/gnot/mmu.c:74,80 | ||
| 1990/0921 | mp->va = tlbvirt; mp->pid = u->p->pid; u->mc.next++; | |
| 1990/0925 | } | |
| 1990/03091 | tlbphys |= VTAG(tlbvirt)<<24; UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; } | |
| 1990/0921/sys/src/9/gnot/mmu.c:84,102 – 1990/0925/sys/src/9/gnot/mmu.c:88,98 | ||
| 1990/0921 | } void | |
| 1990/0925 | clearmmucache(void) | |
| 1990/0921 | { if(u == 0) panic("flushmmucache"); u->mc.next = 0; | |
| 1990/06021 | } void | |
| 1990/0925/sys/src/9/gnot/mmu.c:12,28 – 1990/0928/sys/src/9/gnot/mmu.c:12,17 (short | long) | ||
| 1990/06021 | KMap arena[4*1024*1024/BY2PG]; /* kernel mmu maps up to 4MB */ }kmapalloc; | |
| 1990/0921 |
| |
| 1990/03091 | /* * Called splhi, not in Running state */ | |
| 1990/0925/sys/src/9/gnot/mmu.c:39,56 – 1990/0928/sys/src/9/gnot/mmu.c:28,33 | ||
| 1990/03091 | putkmmu(tlbvirt, tlbphys); flushmmu(); u = (User*)USERADDR; | |
| 1990/0921 | ||
| 1990/0925 |
| |
| 1990/0921 |
| |
| 1990/0925 |
| |
| 1990/03091 | } void | |
| 1990/0925/sys/src/9/gnot/mmu.c:67,80 – 1990/0928/sys/src/9/gnot/mmu.c:44,49 | ||
| 1990/03091 | { if(tlbvirt&KZERO) panic("putmmu"); | |
| 1990/0921 |
| |
| 1990/0925 |
| |
| 1990/03091 | tlbphys |= VTAG(tlbvirt)<<24; UMAP[(tlbvirt&0x003FE000L)>>2] = tlbphys; } | |
| 1990/0925/sys/src/9/gnot/mmu.c:85,98 – 1990/0928/sys/src/9/gnot/mmu.c:54,59 | ||
| 1990/03091 | flushcpucache(); *PARAM &= ~TLBFLUSH_; *PARAM |= TLBFLUSH_; | |
| 1990/0921 |
| |
| 1990/0925 |
| |
| 1990/0921 |
| |
| 1990/06021 | } void | |
| 1990/0928/sys/src/9/gnot/mmu.c:19,25 – 1990/1004/sys/src/9/gnot/mmu.c:19,26 (short | long) | ||
| 1990/03091 | mapstack(Proc *p) { ulong tlbvirt, tlbphys; | |
| 1990/0921 |
| |
| 1990/1004 | ulong next; MMU *mm, *mn, *me; | |
| 1990/03091 | if(p->upage->va != (USERADDR|(p->pid&0xFFFF))) panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); | |
| 1990/0928/sys/src/9/gnot/mmu.c:26,33 – 1990/1004/sys/src/9/gnot/mmu.c:27,55 | ||
| 1990/03091 | tlbvirt = USERADDR; tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; putkmmu(tlbvirt, tlbphys); | |
| 1990/1004 | /* * 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; } | |
| 1990/03091 | } void | |
| 1990/0928/sys/src/9/gnot/mmu.c:45,51 – 1990/1004/sys/src/9/gnot/mmu.c:67,85 | ||
| 1990/03091 | if(tlbvirt&KZERO) panic("putmmu"); tlbphys |= VTAG(tlbvirt)<<24; | |
| 1990/1004 | 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; | |
| 1990/03091 | } void | |
| 1990/0928/sys/src/9/gnot/mmu.c:54,59 – 1990/1004/sys/src/9/gnot/mmu.c:88,101 | ||
| 1990/03091 | flushcpucache(); *PARAM &= ~TLBFLUSH_; *PARAM |= TLBFLUSH_; | |
| 1990/1004 | } void clearmmucache(void) { if(u == 0) panic("flushmmucache"); u->mc.next = 0; | |
| 1990/06021 | } void | |
| 1990/1004/sys/src/9/gnot/mmu.c:27,32 – 1990/1211/sys/src/9/gnot/mmu.c:27,33 (short | long) | ||
| 1990/03091 | tlbvirt = USERADDR; tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; putkmmu(tlbvirt, tlbphys); | |
| 1990/1211 | u = (User*)USERADDR; | |
| 1990/1004 | /* * if not a kernel process and this process was not the | |
| 1990/1004/sys/src/9/gnot/mmu.c:149,152 – 1990/1211/sys/src/9/gnot/mmu.c:150,159 | ||
| 1990/06021 | kmapalloc.free = k; putkmmu(k->va, INVALIDPTE); unlock(&kmapalloc); | |
| 1990/1211 | } void invalidateu(void) { putkmmu(USERADDR, INVALIDPTE); | |
| 1990/03091 | } | |
| 1990/1211/sys/src/9/gnot/mmu.c:54,59 – 1991/0507/sys/src/9/gnot/mmu.c:54,65 (short | long) | ||
| 1990/03091 | } void | |
| 1991/0507 | mmurelease(Proc *p) { USED(p); } void | |
| 1990/03091 | putkmmu(ulong tlbvirt, ulong tlbphys) { if(!(tlbvirt&KZERO)) | |
| 1991/0507/sys/src/9/gnot/mmu.c:22,27 – 1991/0705/sys/src/9/gnot/mmu.c:22,28 (short | long) | ||
| 1990/1004 | ulong next; MMU *mm, *mn, *me; | |
| 1990/03091 | ||
| 1991/0705 | ||
| 1990/03091 | 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; | |
| 1991/0507/sys/src/9/gnot/mmu.c:29,34 – 1991/0705/sys/src/9/gnot/mmu.c:30,41 | ||
| 1990/03091 | putkmmu(tlbvirt, tlbphys); | |
| 1990/1211 | u = (User*)USERADDR; | |
| 1990/1004 | ||
| 1991/0705 | if(p->newtlb) { flushmmu(); clearmmucache(); p->newtlb = 0; } | |
| 1990/1004 | /* * if not a kernel process and this process was not the * last process on this machine, flush & preload mmu | |
| 1991/0507/sys/src/9/gnot/mmu.c:69,75 – 1991/0705/sys/src/9/gnot/mmu.c:76,82 | ||
| 1990/03091 | } void | |
| 1991/0705 | putmmu(ulong tlbvirt, ulong tlbphys, Page *p) | |
| 1990/03091 | { if(tlbvirt&KZERO) panic("putmmu"); | |
| 1991/0507/sys/src/9/gnot/mmu.c:101,107 – 1991/0705/sys/src/9/gnot/mmu.c:108,114 | ||
| 1990/1004 | clearmmucache(void) { if(u == 0) | |
| 1991/0705 | panic("clearmmucache"); | |
| 1990/1004 | u->mc.next = 0; | |
| 1990/06021 | } | |
| 1991/0705/sys/src/9/gnot/mmu.c:127,133 – 1991/0802/sys/src/9/gnot/mmu.c:127,133 (short | long) | ||
| 1990/06021 | return; } e = (4*1024*1024 - 256*1024)/BY2PG; /* screen lives at top 256K */ | |
| 1991/0802 | i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; | |
| 1990/0709 | print("%lud free map registers\n", e-i); | |
| 1990/06021 | kmapalloc.free = 0; for(k=&kmapalloc.arena[i]; i<e; i++,k++){ | |
| 1991/0802/sys/src/9/gnot/mmu.c:140,146 – 1991/0817/sys/src/9/gnot/mmu.c:140,151 (short | long) | ||
| 1990/06021 | kmap(Page *pg) { KMap *k; | |
| 1991/0817 | int s; | |
| 1990/06021 | ||
| 1991/0817 | if(u && u->p){ s = u->p->state; u->p->state = MMUing; } | |
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1990/0709 | if(k == 0){ | |
| 1991/0802/sys/src/9/gnot/mmu.c:151,156 – 1991/0817/sys/src/9/gnot/mmu.c:156,163 | ||
| 1990/06021 | unlock(&kmapalloc); k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); | |
| 1991/0817 | if(u && u->p) u->p->state = s; | |
| 1990/06021 | return k; } | |
| 1991/0817/sys/src/9/gnot/mmu.c:9,15 – 1991/0821/sys/src/9/gnot/mmu.c:9,15 (short | long) | ||
| 1990/06021 | Lock; int init; KMap *free; | |
| 1991/0821 | KMap arena[MB4/BY2PG]; /* kernel mmu maps up to 4MB */ | |
| 1990/06021 | }kmapalloc; | |
| 1990/03091 | /* | |
| 1991/0817/sys/src/9/gnot/mmu.c:120,134 – 1991/0821/sys/src/9/gnot/mmu.c:120,137 | ||
| 1990/06021 | if(kmapalloc.init == 0){ k = &kmapalloc.arena[0]; | |
| 1990/0709 |
| |
| 1991/0821 | k->va = KZERO|(MB4-256*1024-BY2PG); | |
| 1990/06021 | k->next = 0; kmapalloc.free = k; kmapalloc.init = 1; return; } | |
| 1991/0821 | e = (MB4 - 256*1024)/BY2PG; /* screen lives at top 256K */ | |
| 1991/0802 | i = PGROUND(((ulong)ialloc(0, 0))&~KZERO)/BY2PG; | |
| 1991/0821 | ||
| 1990/0709 | print("%lud free map registers\n", e-i); | |
| 1991/0821 | ||
| 1990/06021 | kmapalloc.free = 0; for(k=&kmapalloc.arena[i]; i<e; i++,k++){ k->va = i*BY2PG|KZERO; | |
| 1991/0817/sys/src/9/gnot/mmu.c:140,151 – 1991/0821/sys/src/9/gnot/mmu.c:143,149 | ||
| 1990/06021 | kmap(Page *pg) { KMap *k; | |
| 1991/0817 |
| |
| 1990/06021 | ||
| 1991/0817 |
| |
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1990/0709 | if(k == 0){ | |
| 1991/0817/sys/src/9/gnot/mmu.c:154,163 – 1991/0821/sys/src/9/gnot/mmu.c:152,160 | ||
| 1990/0709 | } | |
| 1990/06021 | kmapalloc.free = k->next; unlock(&kmapalloc); | |
| 1991/0821 | ||
| 1990/06021 | k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); | |
| 1991/0817 |
| |
| 1990/06021 | return k; } | |
| 1991/0817/sys/src/9/gnot/mmu.c:165,174 – 1991/0821/sys/src/9/gnot/mmu.c:162,172 | ||
| 1990/06021 | kunmap(KMap *k) { k->pa = 0; | |
| 1991/0821 | putkmmu(k->va, INVALIDPTE); | |
| 1990/06021 | lock(&kmapalloc); k->next = kmapalloc.free; kmapalloc.free = k; | |
| 1990/1211 | } | |
| 1991/0821/sys/src/9/gnot/mmu.c:143,149 – 1991/0827/sys/src/9/gnot/mmu.c:143,151 (short | long) | ||
| 1990/06021 | kmap(Page *pg) { KMap *k; | |
| 1991/0827 | int s; | |
| 1990/06021 | ||
| 1991/0827 | s = splhi(); | |
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1990/0709 | if(k == 0){ | |
| 1991/0821/sys/src/9/gnot/mmu.c:152,157 – 1991/0827/sys/src/9/gnot/mmu.c:154,160 | ||
| 1990/0709 | } | |
| 1990/06021 | kmapalloc.free = k->next; unlock(&kmapalloc); | |
| 1991/0827 | splx(s); | |
| 1991/0821 | ||
| 1990/06021 | k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); | |
| 1991/0821/sys/src/9/gnot/mmu.c:161,173 – 1991/0827/sys/src/9/gnot/mmu.c:164,180 | ||
| 1990/06021 | void kunmap(KMap *k) { | |
| 1991/0827 | int s; | |
| 1990/06021 | k->pa = 0; | |
| 1991/0821 | putkmmu(k->va, INVALIDPTE); | |
| 1991/0827 | s = splhi(); | |
| 1990/06021 | lock(&kmapalloc); k->next = kmapalloc.free; kmapalloc.free = k; unlock(&kmapalloc); | |
| 1991/0827 | splx(s); | |
| 1990/1211 | } void | |
| 1991/0827/sys/src/9/gnot/mmu.c:143,151 – 1991/0828/sys/src/9/gnot/mmu.c:143,155 (short | long) | ||
| 1990/06021 | kmap(Page *pg) { KMap *k; | |
| 1991/0827 |
| |
| 1991/0828 | int s = 0; | |
| 1990/06021 | ||
| 1991/0827 |
| |
| 1991/0828 | if(u) { s = u->p->state; u->p->state = MMUing; } | |
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1990/0709 | if(k == 0){ | |
| 1991/0827/sys/src/9/gnot/mmu.c:154,163 – 1991/0828/sys/src/9/gnot/mmu.c:158,169 | ||
| 1990/0709 | } | |
| 1990/06021 | kmapalloc.free = k->next; unlock(&kmapalloc); | |
| 1991/0827 |
| |
| 1991/0821 | ||
| 1990/06021 | k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); | |
| 1991/0828 | if(s) u->p->state = s; | |
| 1990/06021 | return k; } | |
| 1991/0828/sys/src/9/gnot/mmu.c:143,154 – 1991/0926/sys/src/9/gnot/mmu.c:143,148 (short | long) | ||
| 1990/06021 | kmap(Page *pg) { KMap *k; | |
| 1991/0828 |
| |
| 1990/06021 | ||
| 1991/0828 |
| |
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1991/0828/sys/src/9/gnot/mmu.c:161,168 – 1991/0926/sys/src/9/gnot/mmu.c:155,160 | ||
| 1991/0821 | ||
| 1990/06021 | k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); | |
| 1991/0828 |
| |
| 1990/06021 | return k; } | |
| 1991/0926/sys/src/9/gnot/mmu.c:23,29 – 1991/0928/sys/src/9/gnot/mmu.c:23,29 (short | long) | ||
| 1990/1004 | MMU *mm, *mn, *me; | |
| 1990/03091 | ||
| 1991/0705 | ||
| 1990/03091 |
| |
| 1991/0928 | if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0) | |
| 1990/03091 | panic("mapstack %d 0x%lux 0x%lux", p->pid, p->upage->pa, p->upage->va); tlbvirt = USERADDR; tlbphys = PPN(p->upage->pa) | PTEVALID | PTEKERNEL; | |
| 1991/0928/sys/src/9/gnot/mmu.c:143,149 – 1991/1004/sys/src/9/gnot/mmu.c:143,151 (short | long) | ||
| 1990/06021 | kmap(Page *pg) { KMap *k; | |
| 1991/0828 | ||
| 1991/1004 | int s; s = splhi(); | |
| 1990/06021 | lock(&kmapalloc); k = kmapalloc.free; | |
| 1990/0709 | if(k == 0){ | |
| 1991/0928/sys/src/9/gnot/mmu.c:152,157 – 1991/1004/sys/src/9/gnot/mmu.c:154,160 | ||
| 1990/0709 | } | |
| 1990/06021 | kmapalloc.free = k->next; unlock(&kmapalloc); | |
| 1991/1004 | splx(s); | |
| 1991/0821 | ||
| 1990/06021 | k->pa = pg->pa; putkmmu(k->va, PPN(k->pa) | PTEVALID | PTEKERNEL); | |
| 1991/1004/sys/src/9/gnot/mmu.c:32,38 – 1992/0103/sys/src/9/gnot/mmu.c:32,37 (short | long) | ||
| 1990/1004 | ||
| 1991/0705 | if(p->newtlb) { flushmmu(); | |
| 1991/1004/sys/src/9/gnot/mmu.c:42,61 – 1992/0103/sys/src/9/gnot/mmu.c:41,46 | ||
| 1990/1004 | */ if(!p->kp && p!=m->lproc){ flushmmu(); | |
| 1990/03091 | } | |
| 1991/1004/sys/src/9/gnot/mmu.c:82,98 – 1992/0103/sys/src/9/gnot/mmu.c:67,72 | ||
| 1990/03091 | panic("putmmu"); tlbphys |= VTAG(tlbvirt)<<24; | |
| 1990/1004 | tlbvirt = (tlbvirt&0x003FE000L)>>2; | |
| 1990/03091 | } | |
| 1991/1004/sys/src/9/gnot/mmu.c:102,115 – 1992/0103/sys/src/9/gnot/mmu.c:76,81 | ||
| 1990/03091 | flushcpucache(); *PARAM &= ~TLBFLUSH_; *PARAM |= TLBFLUSH_; | |
| 1990/1004 |
| |
| 1991/0705 |
| |
| 1990/1004 |
| |
| 1990/06021 | } void | |
| 1992/0103/sys/src/9/gnot/mmu.c:94,100 – 1992/0315/sys/src/9/gnot/mmu.c:94,100 (short | long) | ||
| 1990/06021 | } | |
| 1991/0821 | e = (MB4 - 256*1024)/BY2PG; /* screen lives at top 256K */ | |
| 1991/0802 |
| |
| 1992/0315 | i = PGROUND(palloc.addr0)/BY2PG; | |
| 1991/0821 | ||
| 1990/0709 | print("%lud free map registers\n", e-i); | |
| 1991/0821 | ||
| 1992/0315/sys/src/9/gnot/mmu.c:1,5 – 1992/0321/sys/src/9/gnot/mmu.c:1,5 (short | long) | ||
|
Move lib.h to ../port.
rsc Fri Mar 4 12:44:25 2005 | ||
| 1990/03091 | #include "u.h" | |
| 1992/0321 | #include "../port/lib.h" | |
| 1990/03091 | #include "mem.h" #include "dat.h" #include "fns.h" | |
| 1992/0321/sys/src/9/gnot/mmu.c:99,107 – 1992/0622/sys/src/9/gnot/mmu.c:99,107 (short | long) | ||
| 1990/0709 | print("%lud free map registers\n", e-i); | |
| 1991/0821 | ||
| 1990/06021 | kmapalloc.free = 0; | |
| 1992/0622 | for(k=&kmapalloc.arena[i]; i < e; i++){ | |
| 1990/06021 | k->va = i*BY2PG|KZERO; | |
| 1992/0622 | kunmap(k++); | |
| 1990/06021 | } } | |
| 1992/0622/sys/src/9/gnot/mmu.c:81,88 – 1992/0625/sys/src/9/gnot/mmu.c:81,89 (short | long) | ||
| 1990/06021 | void kmapinit(void) { | |
| 1992/0625 | int i; Page *p; | |
| 1990/06021 | KMap *k; | |
| 1992/0622/sys/src/9/gnot/mmu.c:93,108 – 1992/0625/sys/src/9/gnot/mmu.c:94,110 | ||
| 1990/06021 | return; } | |
| 1991/0821 |
| |
| 1992/0315 |
| |
| 1991/0821 | ||
| 1990/0709 |
| |
| 1991/0821 | ||
| 1990/06021 |
| |
| 1992/0622 |
| |
| 1990/06021 |
| |
| 1992/0622 |
| |
| 1992/0625 | 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++; } | |
| 1990/06021 | } | |
| 1992/0625 | print("%lud free map registers\n", i); | |
| 1990/06021 | } KMap* | |
| 1992/0625/sys/src/9/gnot/mmu.c:82,93 – 1992/0630/sys/src/9/gnot/mmu.c:82,94 (short | long) | ||
| 1990/06021 | kmapinit(void) { | |
| 1992/0625 | int i; | |
| 1992/0630 | ulong endscreen; | |
| 1992/0625 | Page *p; | |
| 1990/06021 | KMap *k; if(kmapalloc.init == 0){ k = &kmapalloc.arena[0]; | |
| 1991/0821 |
| |
| 1992/0630 | k->va = KZERO|(MB4-BY2PG); | |
| 1990/06021 | k->next = 0; kmapalloc.free = k; kmapalloc.init = 1; | |
| 1992/0625/sys/src/9/gnot/mmu.c:95,103 – 1992/0630/sys/src/9/gnot/mmu.c:96,108 | ||
| 1990/06021 | } | |
| 1991/0821 | ||
| 1992/0625 | i = 0; | |
| 1992/0630 | /* * Reclaim map register for pages in bank0; * screen is in virtual space overlaying physical pages; be careful */ endscreen = (PGROUND((ulong)end)&~KZERO) + 256*1024; | |
| 1992/0625 | for(p = palloc.head; p; p = p->next) { | |
| 1992/0630 | if(p->pa >= endscreen && p->pa < MB4) { | |
| 1992/0625 | k = &kmapalloc.arena[p->pa/BY2PG]; k->va = p->pa|KZERO; kunmap(k); | |
| 1992/0630/sys/src/9/gnot/mmu.c:19,26 – 1992/0711/sys/src/9/gnot/mmu.c:19,24 (short | long) | ||
| 1990/03091 | mapstack(Proc *p) { ulong tlbvirt, tlbphys; | |
| 1990/1004 |
| |
| 1990/03091 | ||
| 1991/0705 | ||
| 1991/0928 | if(p->upage->va != (USERADDR|(p->pid&0xFFFF)) && p->pid != 0) | |
| 1992/0630/sys/src/9/gnot/mmu.c:61,68 – 1992/0711/sys/src/9/gnot/mmu.c:59,67 | ||
| 1990/03091 | } void | |
| 1991/0705 |
| |
| 1992/0711 | putmmu(ulong tlbvirt, ulong tlbphys, Page *pg) | |
| 1990/03091 | { | |
| 1992/0711 | USED(pg); | |
| 1990/03091 | if(tlbvirt&KZERO) panic("putmmu"); tlbphys |= VTAG(tlbvirt)<<24; | |
| Too many diffs (26 > 25). Stopping. | ||