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