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