1 /* Copyright (c) 1982 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)start.c 1.1 01/18/82";
4 
5 /*
6  * Begin execution.
7  *
8  * For px, pstart does a traced exec to read in px and then stop.  But we
9  * want control after px has read in the obj file and before it starts
10  * executing.  The "-d" option to px tells it to give us control
11  * by sending itself a signal just prior to interpreting.
12  *
13  * We set a "END_BP" breakpoint at the end of the code so that the
14  * process data doesn't disappear after the program terminates.
15  */
16 
17 #include "defs.h"
18 #include <signal.h>
19 #include "process.h"
20 #include "machine.h"
21 #include "breakpoint.h"
22 #include "source.h"
23 #include "object.h"
24 #include "mappings.h"
25 #include "sym.h"
26 #include "process.rep"
27 
28 #	if (isvaxpx)
29 #		include "pxinfo.h"
30 #	endif
31 
32 LOCAL PROCESS pbuf;
33 
34 start(argv, infile, outfile)
35 char **argv;
36 char *infile, *outfile;
37 {
38 	char *pargv[4];
39 #	if (isvaxpx)
40 		TRAPARGS *ap, t;
41 #	endif
42 
43 	process = &pbuf;
44 	setsigtrace();
45 	if (argv == NIL) {
46 		argv = pargv;
47 #		if (isvaxpx)
48 			pargv[0] = "px";
49 			pargv[1] = "-d";
50 			pargv[2] = objname;
51 			pargv[3] = NIL;
52 #		else
53 			pargv[0] = objname;
54 			pargv[1] = NIL;
55 #		endif
56 	}
57 	pstart(process, argv, infile, outfile);
58 	if (process->status == STOPPED) {
59 #		if (isvaxpx)
60 			pcont(process);
61 			if (process->status != STOPPED) {
62 				panic("px exited with %d", process->exitval);
63 			}
64 			dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
65 			dread(&t, ap, sizeof(TRAPARGS));
66 			if (t.nargs != 5) {
67 				panic("start: args out of sync");
68 			}
69 			DISPLAY = t.disp;
70 			DP = t.dp;
71 			ENDOFF = t.objstart;
72 			PCADDRP = t.pcaddrp;
73 			LOOPADDR = t.loopaddr;
74 #		endif
75 		pc = 0;
76 		curfunc = program;
77 		if (objsize != 0) {
78 			addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
79 		}
80 	}
81 }
82 
83 /*
84  * Note the termination of the program.  We do this so as to avoid
85  * having the process exit, which would make the values of variables
86  * inaccessible.
87  *
88  * Although the END_BP should really be deleted, it is taken
89  * care of by fixbps the next time the program runs.
90  */
91 
92 endprogram()
93 {
94 	char *filename;
95 
96 	if (ss_variables) {
97 		prvarnews();
98 	}
99 	printf("\nexecution completed\n");
100 	curfunc = program;
101 	if ((filename = srcfilename(pc)) != cursource) {
102 		skimsource(filename);
103 	}
104 	curline = lastlinenum;
105 	erecover();
106 }
107 
108 /*
109  * set up what signals we want to trace
110  */
111 
112 LOCAL setsigtrace()
113 {
114 	register int i;
115 	register PROCESS *p;
116 
117 	p = process;
118 	for (i = 1; i < NSIG; i++) {
119 		psigtrace(p, i, TRUE);
120 	}
121 	psigtrace(p, SIGHUP, FALSE);
122 	psigtrace(p, SIGKILL, FALSE);
123 }
124