|
|
1.1 ! root 1: /* $Header: /kernel/kersrc/i286/RCS/trap.c,v 1.1 92/07/17 15:21:35 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: * Trap handler. ! 17: * 8086/8088 Coherent, IBM PC. ! 18: * ! 19: * $Log: trap.c,v $ ! 20: * Revision 1.1 92/07/17 15:21:35 bin ! 21: * Initial revision ! 22: * ! 23: * Revision 1.1 88/03/24 17:39:53 src ! 24: * Initial revision ! 25: * ! 26: * 88/03/06 Allan Cornish /usr/src/sys/i8086/src/trap.c ! 27: * Exception diagnostistics extended. ! 28: * ! 29: * 87/11/02 Allan Cornish /usr/src/sys/i8086/src/trap.c ! 30: * iAPX 286 exception traps added. ! 31: */ ! 32: #include <sys/coherent.h> ! 33: #include <sys/i8086.h> ! 34: #include <sys/systab.h> ! 35: #include <errno.h> ! 36: #include <sys/proc.h> ! 37: #include <sys/seg.h> ! 38: #include <signal.h> ! 39: ! 40: #ifndef EBUG ! 41: #define EBUG 1 ! 42: #endif ! 43: ! 44: /* ! 45: * Trap handler. ! 46: * The arguments are the registers, ! 47: * saved on the stack by machine code. This call ! 48: * is different from most C calls in that the registers ! 49: * get copied back; if you change a "trap" parameter then ! 50: * the machine register will be altered when the trap is ! 51: * dismissed. ! 52: */ ! 53: trap(es, cx, dx, ax, bx, ds, usp, uss, id, ip, cs, fw) ! 54: unsigned es, cx, dx, ax, bx, ds, usp, uss, id, ip, cs, fw; ! 55: { ! 56: register struct systab *stp; ! 57: register int syscall; ! 58: register int callnum; ! 59: register int sigcode; ! 60: long l; ! 61: ! 62: if ( (id >> 8) == SINMI ) ! 63: panic( "Parity error: cs=%x ip=%x\n", cs, ip ); ! 64: ! 65: if (depth != 0) { ! 66: #if EBUG > 0 ! 67: faddr_t fp; ! 68: FP_SEL(fp) = ax; printf("ax "); vprint(fp); ! 69: FP_SEL(fp) = cs; printf("cs "); vprint(fp); ! 70: FP_SEL(fp) = ds; printf("ds "); vprint(fp); ! 71: FP_SEL(fp) = es; printf("es "); vprint(fp); ! 72: FP_SEL(fp) = uss; printf("ss "); vprint(fp); ! 73: #endif ! 74: panic("system trap: id=%x ip=%x ax=%x", id, ip, ax); ! 75: } ! 76: ! 77: if ((SELF->p_flags&PFKERN) != 0) { ! 78: #if EBUG > 0 ! 79: faddr_t fp; ! 80: FP_SEL(fp) = ax; printf("ax "); vprint(fp); ! 81: FP_SEL(fp) = cs; printf("cs "); vprint(fp); ! 82: FP_SEL(fp) = ds; printf("ds "); vprint(fp); ! 83: FP_SEL(fp) = es; printf("es "); vprint(fp); ! 84: FP_SEL(fp) = uss; printf("ss "); vprint(fp); ! 85: #endif ! 86: panic("pid%d: kernel process trap: id=%x, ip=%x ax=%d", ! 87: SELF->p_pid, id, ip, ax); ! 88: } ! 89: ! 90: /* ! 91: * System call. ! 92: */ ! 93: if ( (id >> 8) == SISYS ) { ! 94: u.u_error = 0; ! 95: sigcode = 0; ! 96: syscall = getuwi(ip-2); ! 97: if (u.u_error != 0 || (syscall&0xFF) != 0xCD) { ! 98: sigcode = SIGSYS; ! 99: goto trapend; ! 100: } ! 101: callnum = (syscall>>8) & 0x7F; ! 102: if (callnum >= NMICALL) { ! 103: sigcode = SIGSYS; ! 104: goto trapend; ! 105: } ! 106: stp = &sysitab[callnum]; ! 107: ukcopy(usp+2, u.u_args, stp->s_alen); ! 108: if (u.u_error != 0) { ! 109: sigcode = SIGSYS; ! 110: goto trapend; ! 111: } ! 112: u.u_io.io_seg = IOUSR; ! 113: if (envsave(&u.u_sigenv) != 0) ! 114: u.u_error = EINTR; ! 115: else if ( stp->s_alen <= (3 * sizeof(int)) ) { ! 116: l = (*(long(*)())stp->s_func)(u.u_args[0], ! 117: u.u_args[1], ! 118: u.u_args[2] ); ! 119: ax = ((struct l *) &l)->l_lo; ! 120: dx = ((struct l *) &l)->l_hi; ! 121: } ! 122: else { ! 123: l = (*(long(*)())stp->s_func)(u.u_args[0], ! 124: u.u_args[1], ! 125: u.u_args[2], ! 126: u.u_args[3], ! 127: u.u_args[4], ! 128: u.u_args[5]); ! 129: ax = ((struct l *) &l)->l_lo; ! 130: dx = ((struct l *) &l)->l_hi; ! 131: } ! 132: if (u.u_error != 0) { ! 133: ax = -1; ! 134: dx = -1; ! 135: putuwd(MUERR, u.u_error); ! 136: if (u.u_error == EFAULT) ! 137: sigcode = SIGSYS; ! 138: } ! 139: } ! 140: ! 141: /* ! 142: * Trap. ! 143: */ ! 144: else switch (id>>8) { ! 145: ! 146: case SIDIV: ! 147: sigcode = SIGDIVE; ! 148: break; ! 149: ! 150: case SISST: ! 151: sigcode = SIGTRAP; ! 152: break; ! 153: ! 154: case SIBPT: ! 155: sigcode = SIGTRAP; ! 156: break; ! 157: ! 158: case SIOVF: ! 159: sigcode = SIGOVFL; ! 160: break; ! 161: ! 162: case SIBND: ! 163: /* ! 164: * Bound ! 165: */ ! 166: sigcode = SIGOVFL; ! 167: break; ! 168: ! 169: case SIOP: ! 170: /* ! 171: * Invalid opcode ! 172: */ ! 173: sigcode = SIGSEGV; ! 174: break; ! 175: ! 176: case SIXNP: ! 177: /* ! 178: * Processor extension not available ! 179: */ ! 180: sigcode = SIGSEGV; ! 181: break; ! 182: ! 183: case SIDBL: ! 184: /* ! 185: * Double exception ! 186: */ ! 187: panic("double exception: cs=%x ip=%x", cs, ip); ! 188: sigcode = SIGSEGV; ! 189: break; ! 190: ! 191: case SIXS: ! 192: /* ! 193: * Processor extension segment overrun ! 194: */ ! 195: sigcode = SIGSEGV; ! 196: break; ! 197: ! 198: case SITS: ! 199: /* ! 200: * Invalid task state segment ! 201: */ ! 202: panic("invalid tss: cs=%x ip=%x", cs, ip); ! 203: sigcode = SIGSEGV; ! 204: break; ! 205: ! 206: case SINP: ! 207: /* ! 208: * Segment not present ! 209: */ ! 210: sigcode = SIGSEGV; ! 211: break; ! 212: ! 213: case SISS: ! 214: /* ! 215: * Stack segment overrun/not present ! 216: */ ! 217: sigcode = SIGKILL; ! 218: break; ! 219: ! 220: case SIGP: ! 221: /* ! 222: * General protection. ! 223: */ ! 224: sigcode = SIGSEGV; ! 225: break; ! 226: ! 227: default: ! 228: panic("user trap: id=%x ip=%x\n", id, ip ); ! 229: } ! 230: ! 231: trapend: ! 232: if ( sigcode != 0 ) { ! 233: if ( sigcode == SIGSEGV ) { ! 234: #if EBUG > 0 ! 235: faddr_t fp; ! 236: FP_SEL(fp) = ax; printf("\tax "); vprint(fp); ! 237: FP_SEL(fp) = cs; printf("\tcs "); vprint(fp); ! 238: FP_SEL(fp) = ds; printf("\tds "); vprint(fp); ! 239: FP_SEL(fp) = es; printf("\tes "); vprint(fp); ! 240: FP_SEL(fp) = uss; printf("\tss "); vprint(fp); ! 241: printf("user trap: SEGV id=%x ax=%x pid=%d\n", ! 242: id, ax, SELF->p_pid ); ! 243: { char cmd[11]; int i; ! 244: for (i = 0; i < 10; i++) { ! 245: cmd[i] = u.u_comm[i]; ! 246: } ! 247: cmd[10] = '\0'; ! 248: printf("\tip=%x sp=%x cmd=%s\n", ip, usp, cmd); ! 249: } ! 250: ! 251: /* ! 252: * Force core dump. ! 253: */ ! 254: u.u_sfunc[SIGSEGV] = SIG_DFL; ! 255: #endif ! 256: } ! 257: sendsig(sigcode, SELF); ! 258: } ! 259: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.