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