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