1 /* Copyright (c) 1982 Regents of the University of California */ 2 3 static char sccsid[] = "@(#)start.c 1.7 03/08/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 zeroth argument 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 "main.h" 22 #include "breakpoint.h" 23 #include "source.h" 24 #include "object.h" 25 #include "mappings.h" 26 #include "sym.h" 27 #include "process.rep" 28 29 # if (isvaxpx) 30 # include "pxinfo.h" 31 # endif 32 33 start(argv, infile, outfile) 34 char **argv; 35 char *infile, *outfile; 36 { 37 char *cmd; 38 39 setsigtrace(); 40 # if (isvaxpx) 41 cmd = "px"; 42 # else 43 cmd = argv[0]; 44 # endif 45 pstart(process, cmd, argv, infile, outfile); 46 if (process->status == STOPPED) { 47 # if (isvaxpx) 48 TRAPARGS *ap, t; 49 50 pcont(process); 51 if (process->status != STOPPED) { 52 if (option('t')) { 53 quit(process->exitval); 54 } else { 55 panic("px exited with %d", process->exitval); 56 } 57 } 58 dread(&ap, process->fp + 2*sizeof(int), sizeof(ap)); 59 dread(&t, ap, sizeof(TRAPARGS)); 60 if (t.nargs != 5) { 61 if (option('t')) { 62 unsetsigtraces(process); 63 pcont(process); 64 quit(process->exitval); 65 } else { 66 panic("start: args out of sync"); 67 } 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 if (ss_variables) { 95 prvarnews(); 96 } 97 printf("\nexecution completed\n"); 98 curfunc = program; 99 skimsource(srcfilename(pc)); 100 curline = lastlinenum; 101 erecover(); 102 } 103 104 /* 105 * set up what signals we want to trace 106 */ 107 108 LOCAL setsigtrace() 109 { 110 register int i; 111 register PROCESS *p; 112 113 p = process; 114 psigtrace(p, SIGINT, TRUE); 115 psigtrace(p, SIGTRAP, TRUE); 116 psigtrace(p, SIGIOT, TRUE); 117 psigtrace(p, SIGILL, TRUE); 118 psigtrace(p, SIGBUS, TRUE); 119 } 120