|
|
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.