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