|
|
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: void * ! 34: bbmalloc(int nbytes) ! 35: { ! 36: int nw, a; ! 37: int s; ! 38: ulong *ans; ! 39: ! 40: nw = nbytes/sizeof(long); ! 41: s = splhi(); ! 42: a = INTLEVEL(s)? 1 : 0; ! 43: if(bbcur[a] + nw > &bbarena[a][nbbarena]) ! 44: ans = bbarena[a]; ! 45: else ! 46: ans = bbcur[a]; ! 47: bbcur[a] = ans + nw; ! 48: splx(s); ! 49: bblast[a] = ans; ! 50: return ans; ! 51: } ! 52: ! 53: void ! 54: bbfree(void *p, int n) ! 55: { ! 56: int a, s; ! 57: ! 58: s = splhi(); ! 59: a = INTLEVEL(s)? 1 : 0; ! 60: if(p == bblast[a]) ! 61: bbcur[a] = (ulong *)(((char *)bblast[a]) + n); ! 62: splx(s); ! 63: } ! 64: ! 65: void ! 66: flushvirtpage(void *p) ! 67: { ! 68: USED(p); ! 69: flushcpucache(); ! 70: } ! 71: ! 72: void ! 73: bbdflush(void *p, int n) ! 74: { ! 75: USED(p, n); ! 76: flushcpucache(); ! 77: } ! 78: ! 79: int ! 80: bbonstack(void) ! 81: { ! 82: if(u) ! 83: return 1; ! 84: return 0; ! 85: } ! 86: ! 87: void ! 88: bbexec(void (*memstart)(void), int len, int onstack) ! 89: { ! 90: if(onstack) { ! 91: icflush(memstart, len); ! 92: memstart(); ! 93: return; ! 94: } ! 95: memstart(); ! 96: bbfree(memstart, len); ! 97: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.