15510Slinton /* Copyright (c) 1982 Regents of the University of California */
25510Slinton 
3*5653Slinton static char sccsid[] = "@(#)start.c 1.2 02/02/82";
45510Slinton 
55510Slinton /*
65510Slinton  * Begin execution.
75510Slinton  *
85510Slinton  * For px, pstart does a traced exec to read in px and then stop.  But we
95510Slinton  * want control after px has read in the obj file and before it starts
10*5653Slinton  * executing.  The zeroth argument to px tells it to give us control
115510Slinton  * by sending itself a signal just prior to interpreting.
125510Slinton  *
135510Slinton  * We set a "END_BP" breakpoint at the end of the code so that the
145510Slinton  * process data doesn't disappear after the program terminates.
155510Slinton  */
165510Slinton 
175510Slinton #include "defs.h"
185510Slinton #include <signal.h>
195510Slinton #include "process.h"
205510Slinton #include "machine.h"
21*5653Slinton #include "main.h"
225510Slinton #include "breakpoint.h"
235510Slinton #include "source.h"
245510Slinton #include "object.h"
255510Slinton #include "mappings.h"
265510Slinton #include "sym.h"
275510Slinton #include "process.rep"
285510Slinton 
295510Slinton #	if (isvaxpx)
305510Slinton #		include "pxinfo.h"
315510Slinton #	endif
325510Slinton 
335510Slinton LOCAL PROCESS pbuf;
345510Slinton 
355510Slinton start(argv, infile, outfile)
365510Slinton char **argv;
375510Slinton char *infile, *outfile;
385510Slinton {
39*5653Slinton 	char *cmd;
405510Slinton 
415510Slinton 	process = &pbuf;
425510Slinton 	setsigtrace();
43*5653Slinton #	if (isvaxpx)
44*5653Slinton 		cmd = "px";
45*5653Slinton #	else
46*5653Slinton 		cmd = argv[0];
47*5653Slinton #	endif
48*5653Slinton 	pstart(process, cmd, argv, infile, outfile);
495510Slinton 	if (process->status == STOPPED) {
505510Slinton #		if (isvaxpx)
51*5653Slinton 			TRAPARGS *ap, t;
52*5653Slinton 
535510Slinton 			pcont(process);
545510Slinton 			if (process->status != STOPPED) {
55*5653Slinton 				if (option('t')) {
56*5653Slinton 					quit(process->exitval);
57*5653Slinton 				} else {
58*5653Slinton 					panic("px exited with %d", process->exitval);
59*5653Slinton 				}
605510Slinton 			}
615510Slinton 			dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
625510Slinton 			dread(&t, ap, sizeof(TRAPARGS));
635510Slinton 			if (t.nargs != 5) {
64*5653Slinton 				if (option('t')) {
65*5653Slinton 					unsetsigtraces(process);
66*5653Slinton 					pcont(process);
67*5653Slinton 					quit(process->exitval);
68*5653Slinton 				} else {
69*5653Slinton 					panic("start: args out of sync");
70*5653Slinton 				}
715510Slinton 			}
725510Slinton 			DISPLAY = t.disp;
735510Slinton 			DP = t.dp;
745510Slinton 			ENDOFF = t.objstart;
755510Slinton 			PCADDRP = t.pcaddrp;
765510Slinton 			LOOPADDR = t.loopaddr;
775510Slinton #		endif
785510Slinton 		pc = 0;
795510Slinton 		curfunc = program;
805510Slinton 		if (objsize != 0) {
815510Slinton 			addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
825510Slinton 		}
83*5653Slinton 	} else {
84*5653Slinton 		panic("could not start program");
855510Slinton 	}
865510Slinton }
875510Slinton 
885510Slinton /*
895510Slinton  * Note the termination of the program.  We do this so as to avoid
905510Slinton  * having the process exit, which would make the values of variables
915510Slinton  * inaccessible.
925510Slinton  *
935510Slinton  * Although the END_BP should really be deleted, it is taken
945510Slinton  * care of by fixbps the next time the program runs.
955510Slinton  */
965510Slinton 
975510Slinton endprogram()
985510Slinton {
995510Slinton 	char *filename;
1005510Slinton 
1015510Slinton 	if (ss_variables) {
1025510Slinton 		prvarnews();
1035510Slinton 	}
1045510Slinton 	printf("\nexecution completed\n");
1055510Slinton 	curfunc = program;
1065510Slinton 	if ((filename = srcfilename(pc)) != cursource) {
1075510Slinton 		skimsource(filename);
1085510Slinton 	}
1095510Slinton 	curline = lastlinenum;
1105510Slinton 	erecover();
1115510Slinton }
1125510Slinton 
1135510Slinton /*
1145510Slinton  * set up what signals we want to trace
1155510Slinton  */
1165510Slinton 
1175510Slinton LOCAL setsigtrace()
1185510Slinton {
1195510Slinton 	register int i;
1205510Slinton 	register PROCESS *p;
1215510Slinton 
1225510Slinton 	p = process;
1235510Slinton 	for (i = 1; i < NSIG; i++) {
1245510Slinton 		psigtrace(p, i, TRUE);
1255510Slinton 	}
1265510Slinton 	psigtrace(p, SIGHUP, FALSE);
1275510Slinton 	psigtrace(p, SIGKILL, FALSE);
1285510Slinton }
129