2 #include "../port/lib.h"
9 char iopages[NIOPAGES / 8];
16 return (iopages[i / 8] & (1 << (i % 8))) == 0;
22 iopages[i / 8] &= ~(1 << (i % 8));
31 for(i = 0; i <= NIOPAGES - n; i++){
32 for(j = 0; j < n; j++)
35 for(j = 0; j < n; j++)
36 iopages[(i + j) / 8] |= (1 << ((i + j) % 8));
41 panic("out of i/o pages");
46 putiopages(int i, int n)
55 vmap(ulong phys, ulong length)
60 length = (ROUNDUP(phys + length, BY2PG) - ROUNDDN(phys, BY2PG)) / BY2PG;
63 phys = ROUNDDN(phys, BY2PG);
64 virt = getiopages(length);
68 *l2++ = phys | L2AP(Krw) | Small | PTEIO;
72 return (void *) (IZERO + BY2PG * virt + off);
76 vunmap(void *virt, ulong length)
80 if((ulong)virt < IZERO || (ulong)virt >= IZERO + NIOPAGES * BY2PG)
81 panic("vunmap: virt=%p", virt);
82 v = (ROUNDDN((ulong) virt, BY2PG) - IZERO) / BY2PG;
83 length = (ROUNDUP(((ulong) virt) + length, BY2PG) - ROUNDDN((ulong) virt, BY2PG)) / BY2PG;
100 setgpio(7 + m->machno, !n);
113 memset(KADDR(l2), 0, n * L2SIZ);
114 for(i = 0; i < n; i++){
115 l1[(IZERO / MiB) + i] = l2 | Coarse;
118 uart = vmap((ulong) uart, BY2PG);
119 periph = vmap(0x48240000, 2 * BY2PG);
120 memset(l1, 0, sizeof(ulong) * (IZERO / MiB));
121 l1[4095] = PRIVL2 | Coarse;
123 for(i = 0; i < 240; i++)
124 pl2[i] = (0x8FF00000 + i * BY2PG) | L2AP(Krw) | Small | Cached | Buffered;
125 pl2[240] = PHYSVECTORS | L2AP(Krw) | Small | Cached | Buffered;
126 pl2[241] = FIRSTMACH | L2AP(Krw) | Small | Cached | Buffered;
128 m = (Mach *) MACHADDR;
137 memmove(l1, p->l1, sizeof p->l1);
142 putmmu(ulong va, ulong pa, Page *)
144 ulong *l1a, *l1b, *l2;
148 l2o = (va % MiB) / BY2PG;
152 if((pa & PTEVALID) == 0)
154 l2 = xspanalloc(L2SIZ, L2SIZ, 0);
155 l1a[l1o] = l1b[l1o] = PADDR(l2) | Coarse;
157 l2 = KADDR(ROUNDDN(l1a[l1o], L2SIZ));
159 if((pa & PTEVALID) == 0){
164 *l2 = ROUNDDN(pa, BY2PG) | Small;
165 if((pa & PTEWRITE) == 0)
169 if((pa & PTEUNCACHED) == 0)
170 *l2 |= Buffered | Cached;
183 for(i = 0; i < nelem(up->l1); i++){
186 free(KADDR(ROUNDDN(p, BY2PG)));
188 memset(up->l1, 0, sizeof up->l1);
189 memset(l1, 0, sizeof up->l1);
204 for(i = 0; i < nelem(p->l1); i++){
207 free(KADDR(ROUNDDN(pg, BY2PG)));
209 memset(p->l1, 0, sizeof p->l1);
215 panic("countpagerefs");
221 if(pa < (ulong)PHYSDRAM || pa > (ulong)(PHYSDRAM + VECTORS - KZERO))
222 panic("kaddr: pa=%#.8lux, pc=%p", pa, getcallerpc(&pa));
223 return (void*)(pa + KZERO - PHYSDRAM);
233 panic("paddr: v=%p", v);
234 return va - KZERO + PHYSDRAM;
240 if(arg < PHYSDRAM || arg > (ulong)(PHYSDRAM + VECTORS - KZERO))
242 return PHYSDRAM - KZERO - arg;