|
|
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.2 (Berkeley) 1/9/89";
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: extern union progcntr pdx_pc; /* address of interpreter program cntr */
40: static void inittrap();
41:
42: main(ac,av)
43:
44: int ac;
45: char **av;
46:
47: {
48: register char *objprog, *file;
49: char *name;
50: register long bytesread, bytestoread, block;
51: register FILE *prog;
52: struct pxhdr pxhd;
53: # define pipe 3
54:
55: /*
56: * Initialize everything
57: */
58: _argc = ac;
59: _argv = av;
60: _nodump = FALSE;
61:
62: /*
63: * Determine how PX was invoked, and how to process the program
64: */
65: file = _argv[1];
66: if (!strcmp(_argv[0], "pdx")) {
67: _mode = PDX;
68: _argv += 2; _argc -= 2;
69: name = _argv[0];
70: } else if (!strcmp(_argv[0], "pix")) {
71: _mode = PIX;
72: _argv++; _argc--;
73: name = _argv[0];
74: } else if (!strcmp(_argv[0], "pipe")) {
75: _mode = PIPE;
76: file = "PIPE";
77: _argv++; _argc--;
78: name = _argv[0];
79: } else {
80: _mode = PX;
81: if (_argc <= 1)
82: file = "obj";
83: name = file;
84: }
85:
86: /*
87: * kludge to check for old style objs.
88: */
89: if (_mode == PX && !strcmp(file, "-")) {
90: fprintf(stderr, "%s is obsolete and must be recompiled\n",
91: _argv[0]);
92: exit(1);
93: }
94: /*
95: * Process program header information
96: */
97: if (_mode == PIPE) {
98: read(pipe,&pxhd,sizeof(struct pxhdr));
99: } else {
100: prog = fopen(file,"r");
101: if (prog == NULL) {
102: perror(file);
103: exit(1);
104: }
105: fread(&pxhd,sizeof(struct pxhdr),1,prog);
106: if (pxhd.magicnum != MAGICNUM) {
107: fseek(prog,(long)(HEADER_BYTES-sizeof(struct pxhdr)),0);
108: fread(&pxhd,sizeof(struct pxhdr),1,prog);
109: }
110: }
111: if (pxhd.magicnum != MAGICNUM) {
112: fprintf(stderr,"%s is not a Pascal interpreter file\n",name);
113: exit(1);
114: }
115: if (pxhd.maketime < createtime) {
116: fprintf(stderr,"%s is obsolete and must be recompiled\n",name);
117: exit(1);
118: }
119:
120: /*
121: * Load program into memory
122: */
123: objprog = malloc((int)pxhd.objsize);
124: if (_mode == PIPE) {
125: bytestoread = pxhd.objsize;
126: bytesread = 0;
127: do {
128: block = read(pipe,(int)(objprog+bytesread),bytestoread);
129: if (block > 0) {
130: bytesread += block;
131: bytestoread -= block;
132: }
133: } while (block > 0);
134: } else {
135: bytesread = fread(objprog,1,(int)pxhd.objsize,prog);
136: fclose(prog);
137: }
138: if (bytesread != pxhd.objsize) {
139: fprintf(stderr,"Read error occurred while loading %s\n",file);
140: exit(1);
141: }
142: if (_mode == PIX)
143: fputs("Execution begins...\n",stderr);
144: /*
145: * set interpreter to catch expected signals and begin interpretation
146: */
147: signal(SIGILL,syserr);
148: signal(SIGBUS,syserr);
149: signal(SIGSYS,syserr);
150: if (signal(SIGINT,SIG_IGN) != SIG_IGN)
151: signal(SIGINT,intr);
152: signal(SIGSEGV,memsize);
153: signal(SIGFPE,EXCEPT);
154: signal(SIGTRAP,liberr);
155:
156: /*
157: * See if we're being watched by the debugger, if so set a trap.
158: */
159: if (_mode == PDX || (_mode == PIX && pxhd.symtabsize > 0)) {
160: inittrap(&_display, &_dp, objprog, &pdx_pc, loopaddr);
161: }
162:
163: /*
164: * do it
165: */
166: interpreter(objprog);
167: /*
168: * reset signals, deallocate memory, and exit normally
169: */
170: signal(SIGINT,SIG_IGN);
171: signal(SIGSEGV,SIG_DFL);
172: signal(SIGFPE,SIG_DFL);
173: signal(SIGTRAP,SIG_DFL);
174: signal(SIGILL,SIG_DFL);
175: signal(SIGBUS,SIG_DFL);
176: signal(SIGSYS,SIG_DFL);
177: PFLUSH();
178: psexit(0);
179: }
180:
181: /*
182: * Generate an IOT trap to tell the debugger that the object code
183: * has been read in. Parameters are there for debugger to look at,
184: * not the procedure.
185: */
186:
187: static void
188: inittrap(dispaddr, dpaddr, endaddr, pcaddr, loopaddrp)
189: union disply *dispaddr;
190: struct disp *dpaddr;
191: char *endaddr;
192: union progcntr *pcaddr;
193: char **loopaddrp;
194: {
195: kill(getpid(), SIGIOT);
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.