|
|
1.1 ! root 1: /* ! 2: * File: work.c ! 3: * ! 4: * Purpose: Manage temporary pages of virtual memory. ! 5: * Pages are allocated in virtually contiguous pairs to allow ! 6: * for straddle operations in target code. ! 7: * ! 8: * $Log: work.c,v $ ! 9: * Revision 2.2 93/07/26 13:57:36 nigel ! 10: * Nigel's R80 ! 11: * ! 12: * Revision 1.1 93/04/14 10:29:40 root ! 13: * r75 ! 14: * ! 15: */ ! 16: ! 17: /* ! 18: * ---------------------------------------------------------------------- ! 19: * Includes. ! 20: */ ! 21: #include <sys/coherent.h> ! 22: ! 23: /* ! 24: * ---------------------------------------------------------------------- ! 25: * Definitions. ! 26: * Constants. ! 27: * Macros with argument lists. ! 28: * Typedefs. ! 29: * Enums. ! 30: */ ! 31: #define START_WORK 0xFFFFA /* Highest scratchpad click pair. */ ! 32: #define MAX_WORK_PAIRS 4 /* Max # in use at one time */ ! 33: ! 34: /* ! 35: * ---------------------------------------------------------------------- ! 36: * Functions. ! 37: * Import Functions. ! 38: * Export Functions. ! 39: * Local Functions. ! 40: */ ! 41: int workAlloc(); ! 42: void workFree(); ! 43: void workPoolInit(); ! 44: ! 45: /* ! 46: * ---------------------------------------------------------------------- ! 47: * Global Data. ! 48: * Import Variables. ! 49: * Export Variables. ! 50: * Local Variables. ! 51: */ ! 52: static int numWorkPairs; /* Number of click pairs in use. */ ! 53: static int maxWorkPairs; /* For monitoring resource use. */ ! 54: ! 55: static int workPool[MAX_WORK_PAIRS]; ! 56: ! 57: /* ! 58: * ---------------------------------------------------------------------- ! 59: * Code. ! 60: */ ! 61: void ! 62: workPoolInit() ! 63: { ! 64: int i, w; ! 65: ! 66: for (i = 0, w = START_WORK; i < MAX_WORK_PAIRS; i++, w -= 2) ! 67: workPool[i] = w; ! 68: } ! 69: ! 70: /* ! 71: * Allocate a click pair of virtual space for temporary use. ! 72: * Panic if none available. ! 73: * Return value is a click number, e.g. 0xFFFFA, suitable for use as ! 74: * an index into ptable1_v[]. The return value plus one is also ! 75: * available for use as a virtual click number. ! 76: */ ! 77: int ! 78: workAlloc() ! 79: { ! 80: int s, ret; ! 81: ! 82: s = sphi(); ! 83: if (numWorkPairs >= MAX_WORK_PAIRS) ! 84: panic("Work pair pool empty"); ! 85: ret = workPool[numWorkPairs++]; ! 86: spl(s); ! 87: #if 0 ! 88: if (numWorkPairs > maxWorkPairs) { ! 89: maxWorkPairs = numWorkPairs; ! 90: printf("Now using %d work pairs ", maxWorkPairs); ! 91: } ! 92: #endif ! 93: return ret; ! 94: } ! 95: ! 96: /* ! 97: * Return a click pair of virtual space to the free pool. ! 98: */ ! 99: void ! 100: workFree(w) ! 101: int w; ! 102: { ! 103: int s; ! 104: ! 105: if (w > START_WORK || w <= START_WORK - MAX_WORK_PAIRS) ! 106: panic("workFree(%x)", w); ! 107: ! 108: ptable1_v [w + 1] = ptable1_v [w] = SEG_ILL; ! 109: mmuupd (); ! 110: ! 111: s = sphi(); ! 112: if (numWorkPairs == 0) ! 113: panic("Work pair pool exploded"); ! 114: workPool[--numWorkPairs] = w; ! 115: spl(s); ! 116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.