|
|
1.1 ! root 1: #include "u.h" ! 2: #include "../port/lib.h" ! 3: #include "mem.h" ! 4: #include "dat.h" ! 5: #include "fns.h" ! 6: #include "io.h" ! 7: ! 8: /* ! 9: * Allocate memory for use in kernel bitblts. ! 10: * The allocated memory must have a flushed instruction ! 11: * cache, and the data cache must be flushed by bbdflush(). ! 12: * To avoid the need for frequent cache flushes, the memory ! 13: * is allocated out of an arena, and the i-cache is only ! 14: * flushed when it has to be reused. By returning an ! 15: * address in non-cached space, the need for flushing the ! 16: * d-cache is avoided. ! 17: * ! 18: * This code will have to be interlocked if we ever get ! 19: * a multiprocessor with a bitmapped display. ! 20: */ ! 21: ! 22: /* a 0->3 bitblt can take 800 longs */ ! 23: enum { ! 24: narena=2, /* put interrupt time stuff in separate arena */ ! 25: nbbarena=4096 /* number of words in an arena */ ! 26: }; ! 27: ! 28: static ulong bbarena[narena][nbbarena]; ! 29: static ulong *bbcur[narena] = {&bbarena[0][0], &bbarena[1][0]}; ! 30: static ulong *bblast[narena] = {0, 0}; ! 31: ! 32: #define INTLEVEL(v) ((v)&0x700) ! 33: ! 34: extern flushvirtpage(void (*)(void)); ! 35: ! 36: void * ! 37: bbmalloc(int nbytes) ! 38: { ! 39: int nw, a; ! 40: int s; ! 41: ulong *ans; ! 42: ! 43: nw = nbytes/sizeof(long); ! 44: s = splhi(); ! 45: a = INTLEVEL(s)? 1 : 0; ! 46: if(bbcur[a] + nw > &bbarena[a][nbbarena]) ! 47: ans = bbarena[a]; ! 48: else ! 49: ans = bbcur[a]; ! 50: bbcur[a] = ans + nw; ! 51: splx(s); ! 52: bblast[a] = ans; ! 53: return ans; ! 54: } ! 55: ! 56: void ! 57: bbfree(void *p, int n) ! 58: { ! 59: int a, s; ! 60: ! 61: s = splhi(); ! 62: a = INTLEVEL(s)? 1 : 0; ! 63: if(p == bblast[a]) ! 64: bbcur[a] = (ulong *)(((char *)bblast[a]) + n); ! 65: splx(s); ! 66: } ! 67: ! 68: void ! 69: bbdflush(void *p, int n) ! 70: { ! 71: ulong pe, l; ! 72: ! 73: pe = (ulong)(((char *)p) + n + (BY2PG-1)); ! 74: for(l = (ulong)p; l < pe; l += BY2PG) ! 75: flushpage(l); ! 76: } ! 77: ! 78: int ! 79: bbonstack(void) ! 80: { ! 81: if(u) ! 82: return 1; ! 83: return 0; ! 84: } ! 85: ! 86: void ! 87: bbexec(void (*memstart)(void), int len, int onstack) ! 88: { ! 89: if(onstack) { ! 90: flushvirtpage(memstart); ! 91: memstart(); ! 92: } else { ! 93: bbdflush(memstart, len); ! 94: memstart(); ! 95: bbfree(memstart, len); ! 96: } ! 97: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.