|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: char copyright[] = ! 9: "@(#) Copyright (c) 1980 Regents of the University of California.\n\ ! 10: All rights reserved.\n"; ! 11: #endif not lint ! 12: ! 13: #ifndef lint ! 14: static char sccsid[] = "@(#)int.c 5.1 (Berkeley) 6/5/85"; ! 15: #endif not lint ! 16: ! 17: /* ! 18: * px - interpreter for Berkeley Pascal ! 19: * Version 3.0 Winter 1979 ! 20: * ! 21: * Original version for the PDP 11/70 authored by: ! 22: * Bill Joy, Charles Haley, Ken Thompson ! 23: * ! 24: * Rewritten for VAX 11/780 by Kirk McKusick ! 25: */ ! 26: ! 27: #include <signal.h> ! 28: #include "whoami.h" ! 29: #include "vars.h" ! 30: #include "libpc.h" ! 31: #include "objfmt.h" ! 32: ! 33: /* ! 34: * New stuff for pdx ! 35: */ ! 36: ! 37: extern char *end; ! 38: extern loopaddr(); ! 39: union progcntr *pcaddrp; /* address of interpreter frame address */ ! 40: ! 41: main(ac,av) ! 42: ! 43: int ac; ! 44: char **av; ! 45: ! 46: { ! 47: register char *objprog, *file; ! 48: char *name; ! 49: register long bytesread, bytestoread, block; ! 50: register FILE *prog; ! 51: struct pxhdr pxhd; ! 52: # define pipe 3 ! 53: ! 54: /* ! 55: * Initialize everything ! 56: */ ! 57: _argc = ac; ! 58: _argv = av; ! 59: _nodump = FALSE; ! 60: ! 61: /* ! 62: * Determine how PX was invoked, and how to process the program ! 63: */ ! 64: file = _argv[1]; ! 65: if (!strcmp(_argv[0], "pdx")) { ! 66: _mode = PDX; ! 67: _argv += 2; _argc -= 2; ! 68: name = _argv[0]; ! 69: } else if (!strcmp(_argv[0], "pix")) { ! 70: _mode = PIX; ! 71: _argv++; _argc--; ! 72: name = _argv[0]; ! 73: } else if (!strcmp(_argv[0], "pipe")) { ! 74: _mode = PIPE; ! 75: file = "PIPE"; ! 76: _argv++; _argc--; ! 77: name = _argv[0]; ! 78: } else { ! 79: _mode = PX; ! 80: if (_argc <= 1) ! 81: file = "obj"; ! 82: name = file; ! 83: } ! 84: ! 85: /* ! 86: * kludge to check for old style objs. ! 87: */ ! 88: if (_mode == PX && !strcmp(file, "-")) { ! 89: fprintf(stderr, "%s is obsolete and must be recompiled\n", ! 90: _argv[0]); ! 91: exit(1); ! 92: } ! 93: /* ! 94: * Process program header information ! 95: */ ! 96: if (_mode == PIPE) { ! 97: read(pipe,&pxhd,sizeof(struct pxhdr)); ! 98: } else { ! 99: prog = fopen(file,"r"); ! 100: if (prog == NULL) { ! 101: perror(file); ! 102: exit(1); ! 103: } ! 104: fread(&pxhd,sizeof(struct pxhdr),1,prog); ! 105: if (pxhd.magicnum != MAGICNUM) { ! 106: fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0); ! 107: fread(&pxhd,sizeof(struct pxhdr),1,prog); ! 108: } ! 109: } ! 110: if (pxhd.magicnum != MAGICNUM) { ! 111: fprintf(stderr,"%s is not a Pascal interpreter file\n",name); ! 112: exit(1); ! 113: } ! 114: if (pxhd.maketime < createtime) { ! 115: fprintf(stderr,"%s is obsolete and must be recompiled\n",name); ! 116: exit(1); ! 117: } ! 118: ! 119: /* ! 120: * Load program into memory ! 121: */ ! 122: objprog = malloc((int)pxhd.objsize); ! 123: if (_mode == PIPE) { ! 124: bytestoread = pxhd.objsize; ! 125: bytesread = 0; ! 126: do { ! 127: block = read(pipe,(int)(objprog+bytesread),bytestoread); ! 128: if (block > 0) { ! 129: bytesread += block; ! 130: bytestoread -= block; ! 131: } ! 132: } while (block > 0); ! 133: } else { ! 134: bytesread = fread(objprog,1,(int)pxhd.objsize,prog); ! 135: fclose(prog); ! 136: } ! 137: if (bytesread != pxhd.objsize) { ! 138: fprintf(stderr,"Read error occurred while loading %s\n",file); ! 139: exit(1); ! 140: } ! 141: if (_mode == PIX) ! 142: fputs("Execution begins...\n",stderr); ! 143: /* ! 144: * set interpreter to catch expected signals and begin interpretation ! 145: */ ! 146: signal(SIGILL,syserr); ! 147: signal(SIGBUS,syserr); ! 148: signal(SIGSYS,syserr); ! 149: if (signal(SIGINT,SIG_IGN) != SIG_IGN) ! 150: signal(SIGINT,intr); ! 151: signal(SIGSEGV,memsize); ! 152: signal(SIGFPE,EXCEPT); ! 153: signal(SIGTRAP,liberr); ! 154: ! 155: /* ! 156: * See if we're being watched by the debugger, if so set a trap. ! 157: */ ! 158: if (_mode == PDX || (_mode == PIX && pxhd.symtabsize > 0)) { ! 159: inittrap(&_display, &_dp, objprog, &pcaddrp, loopaddr); ! 160: } ! 161: ! 162: /* ! 163: * do it ! 164: */ ! 165: interpreter(objprog); ! 166: /* ! 167: * reset signals, deallocate memory, and exit normally ! 168: */ ! 169: signal(SIGINT,SIG_IGN); ! 170: signal(SIGSEGV,SIG_DFL); ! 171: signal(SIGFPE,SIG_DFL); ! 172: signal(SIGTRAP,SIG_DFL); ! 173: signal(SIGILL,SIG_DFL); ! 174: signal(SIGBUS,SIG_DFL); ! 175: signal(SIGSYS,SIG_DFL); ! 176: PFLUSH(); ! 177: psexit(0); ! 178: } ! 179: ! 180: /* ! 181: * Generate an IOT trap to tell the debugger that the object code ! 182: * has been read in. Parameters are there for debugger to look at, ! 183: * not the procedure. ! 184: */ ! 185: ! 186: static inittrap(dispaddr, dpaddr, endaddr, pcaddrp, loopaddrp) ! 187: union disply *dispaddr; ! 188: struct disp *dpaddr; ! 189: char *endaddr; ! 190: union progcntr **pcaddrp; ! 191: char **loopaddrp; ! 192: { ! 193: kill(getpid(), SIGIOT); ! 194: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.