| plan 9 kernel history: overview | file list | diff list |
2000/0924/bitsy/mmu.c (diff list | history)
| 2000/0923/sys/src/9/bitsy/mmu.c:94,155 – 2000/0924/sys/src/9/bitsy/mmu.c:94,158 (short | long | prev | next) | ||
| 2000/0923 | * map special space uncached, assume that the space isn't already mapped | |
| 2000/0907 | */ ulong* | |
| 2000/0923 |
| |
| 2000/0909 |
| |
| 2000/0924 | mapspecial(ulong pa, int len) | |
| 2000/0907 | { ulong *t; | |
| 2000/0921 |
| |
| 2000/0924 | ulong va, i, base, end, off; int livelarge; ulong* rv; | |
| 2000/0907 | ||
| 2000/0921 |
| |
| 2000/0924 | rv = nil; livelarge = len >= 128*1024; if(livelarge){ base = pa & ~(OneMeg-1); end = (pa+len-1) & ~(OneMeg-1); } else { base = pa & ~(BY2PG-1); end = (pa+len-1) & ~(BY2PG-1); } off = pa - base; | |
| 2000/0921 | ||
| 2000/0907 |
| |
| 2000/0909 |
| |
| 2000/0907 |
| |
| 2000/0924 | for(va = REGZERO; va < REGTOP && base >= end; va += OneMeg){ if((l1table[va>>20] & L1TypeMask) != L1PageTable){ /* found unused entry on level 1 table */ if(livelarge){ if(rv == nil) rv = (ulong*)(va+i*BY2PG+off); l1table[va>>20] = L1Section | L1KernelRW | (base&L1SectBaseMask); base += OneMeg; continue; } /* create a page table and keep going */ | |
| 2000/0907 | t = xspanalloc(BY2PG, 1024, 0); memzero(t, BY2PG, 0); | |
| 2000/0921 |
| |
| 2000/0924 | l1table[va>>20] = L1PageTable | L1Domain0 | | |
| 2000/0921 | (((ulong)t) & L1PTBaseMask); | |
| 2000/0907 |
| |
| 2000/0909 |
| |
| 2000/0924 | t = (ulong*)(l1table[va>>20] & L1PTBaseMask); | |
| 2000/0907 | for(i = 0; i < OneMeg; i += BY2PG){ | |
| 2000/0921 |
| |
| 2000/0924 | entry = t[i>>PGSHIFT]; | |
| 2000/0921 |
| |
| 2000/0907 |
| |
| 2000/0921 |
| |
| 2000/0923 |
| |
| 2000/0921 |
| |
| 2000/0924 | /* found unused entry on level 2 table */ if((entry & L2TypeMask) != L2SmallPage){ if(rv == nil) rv = (ulong*)(va+i*BY2PG+off); t[i>>PGSHIFT] = L2SmallPage | L2KernelRW | (base & L2PageBaseMask); base += BY2PG; continue; | |
| 2000/0921 | } | |
| 2000/0907 | } | |
| 2000/0909 |
| |
| 2000/0907 |
| |
| 2000/0909 | ||
| 2000/0920 |
| |
| 2000/0924 | /* didn't fit */ if(base <= end) return nil; return rv; | |
| 2000/0905 | } void | |