|
|
1.1 ! root 1: /* ! 2: * coh.386/misc.c ! 3: * ! 4: * Miscellaneous routines. ! 5: * ! 6: * Revised: Thu Jul 15 14:18:13 1993 CDT ! 7: */ ! 8: #include <sys/coherent.h> ! 9: #include <sys/acct.h> ! 10: #include <sys/errno.h> ! 11: #include <sys/ino.h> ! 12: #include <sys/stat.h> ! 13: ! 14: #ifdef TRACER ! 15: extern unsigned t_piggy; ! 16: #endif ! 17: ! 18: /* ! 19: * Make sure we are the super user. ! 20: */ ! 21: ! 22: super() ! 23: { ! 24: if (u.u_uid) { ! 25: u.u_error = EPERM; ! 26: return 0; ! 27: } ! 28: u.u_flag |= ASU; ! 29: return 1; ! 30: } ! 31: ! 32: /* ! 33: * Make sure we are the gived `uid' or the super user. ! 34: */ ! 35: ! 36: owner(uid) ! 37: { ! 38: if (u.u_uid == uid) ! 39: return 1; ! 40: if (u.u_uid == 0) { ! 41: u.u_flag |= ASU; ! 42: return 1; ! 43: } ! 44: u.u_error = EPERM; ! 45: return 0; ! 46: } ! 47: ! 48: /* ! 49: * Use printf to generate a call-trace. ! 50: */ ! 51: ! 52: void backtrace (dummy) ! 53: long dummy; ! 54: { ! 55: long * bp = (& dummy) - 2; ! 56: ! 57: printf ("Call backtrace: "); ! 58: do { ! 59: bp = (long *) * bp; ! 60: printf (" -> %x", * (bp + 1)); ! 61: } while (* bp != NULL); ! 62: printf ("\n"); ! 63: } ! 64: ! 65: /* ! 66: * Panic. ! 67: */ ! 68: void ! 69: panic(a1) ! 70: char *a1; ! 71: { ! 72: static panflag; ! 73: ! 74: sphi (); ! 75: ! 76: #ifdef TRACER ! 77: if (t_piggy & 0x80) { ! 78: if (panflag ++ == 0) { ! 79: printf ("Panic: %r", &a1); ! 80: putchar ('\n'); ! 81: usync (); ! 82: } ! 83: printf ("relax! It really isn't so bad.\n"); ! 84: } else { ! 85: if (panflag ++ == 0) { ! 86: if (paging ()) { ! 87: printf ("Panic: %r", &a1); ! 88: putchar ('\n'); ! 89: } else { ! 90: strchirp ("Panic: "); ! 91: strchirp (a1); ! 92: } ! 93: backtrace (0); ! 94: for (;;) ! 95: /* DO NOTHING */ ; ! 96: usync (); ! 97: } ! 98: halt (); ! 99: } ! 100: #else ! 101: if (panflag ++ == 0) { ! 102: printf ("Panic: %r", &a1); ! 103: putchar ('\n'); ! 104: for (;;) ! 105: /* DO NOTHING */ ; ! 106: usync (); ! 107: } ! 108: halt (); ! 109: #endif /* TRACER */ ! 110: ! 111: -- panflag; ! 112: } ! 113: ! 114: /* ! 115: * Print a message from a device driver. ! 116: */ ! 117: devmsg(dev, a1) ! 118: dev_t dev; ! 119: char *a1; ! 120: { ! 121: printf ("(%d,%d): %r", major(dev), minor(dev), &a1); ! 122: printf ("\n"); ! 123: } ! 124: ! 125: /* ! 126: * Wait up to "ticks" clock ticks for an event to occur. ! 127: * A tick is 1/HZ seconds (10 msec). ! 128: * Works whether interrupts are enabled or not. ! 129: * Busy-waits the system. ! 130: * The event occurs when (*fn)() returns a nonzero value. ! 131: * If fn is NULL, delay unconditionally. ! 132: * ! 133: * Return 0 if timeout occurred, 1 if the desired event occurred. ! 134: */ ! 135: ! 136: #define THRESH (T0_RATE/2) /* half of 11932 */ ! 137: ! 138: int ! 139: busyWait(fn, ticks) ! 140: int (*fn)(); ! 141: int ticks; ! 142: { ! 143: /* ! 144: * p0, p1 are 0 if in low half of counting cycle, else 1. ! 145: * flips counts the number of changes from low-to-high or vice versa. ! 146: * tickCt counts the number of clock ticks at rate HZ. ! 147: */ ! 148: ! 149: int tickCt = 0; ! 150: int flips = 0; ! 151: int p0 = read_t0 () < THRESH ? 0 : 1; ! 152: int p1; ! 153: ! 154: for (;;) { ! 155: if (fn && (* fn) ()) ! 156: return 1; ! 157: ! 158: /* did we change halves of counter cycle? */ ! 159: p1 = read_t0 () < THRESH ? 0 : 1; ! 160: if (p0 != p1) { ! 161: p0 = p1; ! 162: flips ++; ! 163: ! 164: /* two phase flips make a tick */ ! 165: if (flips >= 2) { ! 166: flips = 0; ! 167: tickCt ++; ! 168: if (tickCt > ticks) ! 169: return 0; ! 170: } ! 171: } ! 172: ! 173: } ! 174: } ! 175: ! 176: /* ! 177: * busyWait2() has finer granularity than busyWait(). ! 178: * ! 179: * Wait up to "counts" clock counts for an event to occur. ! 180: * A count is 1/(11932*HZ) seconds (about 0.84 usec). ! 181: * Works whether interrupts are enabled or not. ! 182: * Busy-waits the system. ! 183: * The event occurs when (*fn)() returns a nonzero value. ! 184: * If fn is NULL, delay unconditionally. ! 185: * ! 186: * Return 0 if timeout occurred, 1 if the desired event occurred. ! 187: */ ! 188: ! 189: int ! 190: busyWait2 (fn, counts) ! 191: int (*fn)(); ! 192: unsigned int counts; ! 193: { ! 194: /* ! 195: * ct0 is previous t0 reading, ct1 is current reading. ! 196: * We have timer rollover when ct1 < ct0. ! 197: */ ! 198: ! 199: unsigned int totCt = 0; ! 200: unsigned int ct0 = read_t0 (); ! 201: unsigned int ct1; ! 202: ! 203: for (;;) { ! 204: if (fn && (* fn) ()) ! 205: return 1; ! 206: ! 207: ct1 = read_t0 (); ! 208: if (ct1 > ct0) { ! 209: /* no timer 0 rollover */ ! 210: totCt += ct1 - ct0; ! 211: } else { ! 212: /* timer 0 rollover */ ! 213: totCt += ct1 + T0_RATE - ct0; ! 214: } ! 215: if (totCt > counts) ! 216: return 0; ! 217: ct0 = ct1; ! 218: } ! 219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.