|
|
1.1 ! root 1: /* $Header: /src386/kernel/coh.386/RCS/misc.c,v 1.8 93/06/14 13:34:48 bin Exp Locker: bin $ */ ! 2: /* (lgl- ! 3: * The information contained herein is a trade secret of Mark Williams ! 4: * Company, and is confidential information. It is provided under a ! 5: * license agreement, and may be copied or disclosed only under the ! 6: * terms of that agreement. Any reproduction or disclosure of this ! 7: * material without the express written authorization of Mark Williams ! 8: * Company or persuant to the license agreement is unlawful. ! 9: * ! 10: * COHERENT Version 2.3.37 ! 11: * Copyright (c) 1982, 1983, 1984. ! 12: * An unpublished work by Mark Williams Company, Chicago. ! 13: * All rights reserved. ! 14: -lgl) */ ! 15: /* ! 16: * Coherent. ! 17: * Miscellaneous routines. ! 18: * ! 19: * $Log: misc.c,v $ ! 20: * Revision 1.8 93/06/14 13:34:48 bin ! 21: * Hal: kernel 78 update ! 22: * ! 23: * Revision 1.4 93/04/14 10:06:36 root ! 24: * r75 ! 25: * ! 26: * Revision 1.3 92/11/09 17:10:53 root ! 27: * Just before adding vio segs. ! 28: * ! 29: * Revision 1.2 92/01/06 11:59:45 hal ! 30: * Compile with cc.mwc. ! 31: * ! 32: * Revision 1.1 88/03/24 16:14:01 src ! 33: * Initial revision ! 34: * ! 35: * 87/05/08 Allan Cornish /usr/src/sys/coh/misc.c ! 36: * System code and data segments no longer reported in panic messages. ! 37: * ! 38: * 87/02/17 Allan Cornish /usr/src/sys/coh/misc.c ! 39: * Panic message now includes system code and data segments. ! 40: */ ! 41: #include <sys/coherent.h> ! 42: #include <sys/acct.h> ! 43: #include <errno.h> ! 44: #include <sys/ino.h> ! 45: #include <sys/stat.h> ! 46: ! 47: #ifdef TRACER ! 48: extern unsigned t_piggy; ! 49: #endif ! 50: ! 51: /* ! 52: * Make sure we are the super user. ! 53: */ ! 54: super() ! 55: { ! 56: if (u.u_uid) { ! 57: u.u_error = EPERM; ! 58: return (0); ! 59: } ! 60: u.u_flag |= ASU; ! 61: return (1); ! 62: } ! 63: ! 64: /* ! 65: * Make sure we are the gived `uid' or the super user. ! 66: */ ! 67: owner(uid) ! 68: { ! 69: if (u.u_uid == uid) ! 70: return (1); ! 71: if (u.u_uid == 0) { ! 72: u.u_flag |= ASU; ! 73: return (1); ! 74: } ! 75: u.u_error = EPERM; ! 76: return (0); ! 77: } ! 78: ! 79: /* ! 80: * Panic. ! 81: */ ! 82: void ! 83: panic(a1) ! 84: char *a1; ! 85: { ! 86: static panflag; ! 87: sphi(); ! 88: ! 89: #ifdef TRACER ! 90: if ( t_piggy & 0x80 ) { ! 91: if (panflag++ == 0) { ! 92: printf("Panic: %r", &a1); ! 93: putchar('\n'); ! 94: usync(); ! 95: } ! 96: printf("relax! It really isn't so bad.\n"); ! 97: } else { ! 98: if (panflag++ == 0) { ! 99: if (paging()) { ! 100: printf("Panic: %r", &a1); ! 101: putchar('\n'); ! 102: } else { ! 103: strchirp("Panic: "); ! 104: strchirp(a1); ! 105: } ! 106: for (;;); ! 107: usync(); ! 108: } ! 109: halt(); ! 110: } ! 111: #else ! 112: if (panflag++ == 0) { ! 113: printf("Panic: %r", &a1); ! 114: putchar('\n'); ! 115: for (;;); ! 116: usync(); ! 117: } ! 118: halt(); ! 119: #endif /* TRACER */ ! 120: ! 121: --panflag; ! 122: } ! 123: ! 124: /* ! 125: * Print a message from a device driver. ! 126: */ ! 127: devmsg(dev, a1) ! 128: dev_t dev; ! 129: char *a1; ! 130: { ! 131: printf("(%d,%d): %r", major(dev), minor(dev), &a1); ! 132: printf("\n"); ! 133: } ! 134: ! 135: /* ! 136: * Wait up to "ticks" clock ticks for an event to occur. ! 137: * A tick is 1/HZ seconds (10 msec). ! 138: * Works whether interrupts are enabled or not. ! 139: * Busy-waits the system. ! 140: * The event occurs when (*fn)() returns a nonzero value. ! 141: * If fn is NULL, delay unconditionally. ! 142: * ! 143: * Return 0 if timeout occurred, 1 if the desired event occurred. ! 144: */ ! 145: ! 146: #define THRESH (T0_RATE/2) /* half of 11932 */ ! 147: ! 148: int ! 149: busyWait(fn, ticks) ! 150: int (*fn)(); ! 151: int ticks; ! 152: { ! 153: /* ! 154: * p0, p1 are 0 if in low half of counting cycle, else 1. ! 155: * flips counts the number of changes from low-to-high or vice versa. ! 156: * tickCt counts the number of clock ticks at rate HZ. ! 157: */ ! 158: ! 159: int tickCt = 0; ! 160: int flips = 0; ! 161: int p0 = (read_t0() < THRESH)?0:1; ! 162: int p1; ! 163: ! 164: for (;;) { ! 165: if (fn && (*fn)()) ! 166: return 1; ! 167: ! 168: /* did we change halves of counter cycle? */ ! 169: p1 = (read_t0() < THRESH)?0:1; ! 170: if (p0 != p1) { ! 171: p0 = p1; ! 172: flips++; ! 173: ! 174: /* two phase flips make a tick */ ! 175: if (flips >= 2) { ! 176: flips = 0; ! 177: tickCt++; ! 178: if (tickCt > ticks) ! 179: return 0; ! 180: } ! 181: } ! 182: ! 183: } ! 184: } ! 185: ! 186: /* ! 187: * busyWait2() has finer granularity than busyWait(). ! 188: * ! 189: * Wait up to "counts" clock counts for an event to occur. ! 190: * A count is 1/(11932*HZ) seconds (about 0.84 usec). ! 191: * Works whether interrupts are enabled or not. ! 192: * Busy-waits the system. ! 193: * The event occurs when (*fn)() returns a nonzero value. ! 194: * If fn is NULL, delay unconditionally. ! 195: * ! 196: * Return 0 if timeout occurred, 1 if the desired event occurred. ! 197: */ ! 198: ! 199: int ! 200: busyWait2(fn, counts) ! 201: int (*fn)(); ! 202: unsigned int counts; ! 203: { ! 204: /* ! 205: * ct0 is previous t0 reading, ct1 is current reading. ! 206: * We have timer rollover when ct1 < ct0. ! 207: */ ! 208: ! 209: unsigned int totCt = 0; ! 210: unsigned int ct0 = read_t0(); ! 211: unsigned int ct1; ! 212: ! 213: for (;;) { ! 214: if (fn && (*fn)()) ! 215: return 1; ! 216: ! 217: ct1 = read_t0(); ! 218: if (ct1 > ct0) { ! 219: /* no timer 0 rollover */ ! 220: totCt += ct1 - ct0; ! 221: } else { ! 222: /* timer 0 rollover */ ! 223: totCt += ct1 + T0_RATE - ct0; ! 224: } ! 225: if (totCt > counts) ! 226: return 0; ! 227: ct0 = ct1; ! 228: } ! 229: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.