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