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