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