148096Sbostic /*-
2*62144Sbostic * Copyright (c) 1980, 1993
3*62144Sbostic * The Regents of the University of California. All rights reserved.
448096Sbostic *
548096Sbostic * %sccs.include.redist.c%
622514Sdist */
75510Slinton
822514Sdist #ifndef lint
9*62144Sbostic static char sccsid[] = "@(#)start.c 8.1 (Berkeley) 06/06/93";
1048096Sbostic #endif /* not lint */
1130848Smckusick
125510Slinton /*
135510Slinton * Begin execution.
145510Slinton *
155510Slinton * For px, pstart does a traced exec to read in px and then stop. But we
165510Slinton * want control after px has read in the obj file and before it starts
175653Slinton * executing. The zeroth argument to px tells it to give us control
185510Slinton * by sending itself a signal just prior to interpreting.
195510Slinton *
205510Slinton * We set a "END_BP" breakpoint at the end of the code so that the
215510Slinton * process data doesn't disappear after the program terminates.
225510Slinton */
235510Slinton
245510Slinton #include "defs.h"
255510Slinton #include <signal.h>
265510Slinton #include "process.h"
275510Slinton #include "machine.h"
285653Slinton #include "main.h"
295510Slinton #include "breakpoint.h"
305510Slinton #include "source.h"
315510Slinton #include "object.h"
325510Slinton #include "mappings.h"
335510Slinton #include "sym.h"
345510Slinton #include "process.rep"
355510Slinton
3630848Smckusick #include "pxinfo.h"
375510Slinton
start(argv,infile,outfile)385510Slinton start(argv, infile, outfile)
395510Slinton char **argv;
405510Slinton char *infile, *outfile;
415510Slinton {
425714Slinton char *cmd;
435510Slinton
445714Slinton setsigtrace();
4536538Smckusick cmd = "px";
465714Slinton pstart(process, cmd, argv, infile, outfile);
475714Slinton if (process->status == STOPPED) {
4830848Smckusick TRAPARGS *ap, t;
495653Slinton
5030848Smckusick pcont(process);
5130848Smckusick if (process->status != STOPPED) {
5230848Smckusick if (option('t')) {
5330848Smckusick quit(process->exitval);
5430848Smckusick } else {
5530848Smckusick panic("px exited with %d", process->exitval);
565714Slinton }
5730848Smckusick }
5830848Smckusick #ifdef tahoe
5930848Smckusick dread(&ap, process->fp, sizeof(ap));
6030848Smckusick ap = (TRAPARGS *)((unsigned)ap - 4);
6130848Smckusick dread(&RETLOC, process->fp - 8, sizeof(RETLOC));
6230848Smckusick #else
6330848Smckusick dread(&ap, process->fp + 2*sizeof(int), sizeof(ap));
6430848Smckusick #endif
6530848Smckusick dread(&t, ap, sizeof(TRAPARGS));
6630848Smckusick
6730848Smckusick #define NARGS 5
6830848Smckusick #ifdef tahoe
6930848Smckusick # define STKNARGS (sizeof(int)*(NARGS+1))
7030848Smckusick # define NARGLOC t.trp_removed
7130848Smckusick #else
7230848Smckusick # define STKNARGS (NARGS)
7330848Smckusick # define NARGLOC t.nargs
7430848Smckusick #endif
7530848Smckusick if (NARGLOC != STKNARGS) {
7630848Smckusick if (option('t')) {
7730848Smckusick unsetsigtraces(process);
7830848Smckusick pcont(process);
7930848Smckusick quit(process->exitval);
8030848Smckusick } else {
8130848Smckusick panic("start: args out of sync");
825714Slinton }
8330848Smckusick }
8430848Smckusick DISPLAY = t.disp;
8530848Smckusick DP = t.dp;
8630848Smckusick ENDOFF = t.objstart;
8736538Smckusick PCADDR = t.pcaddr;
8830848Smckusick LOOPADDR = t.loopaddr;
895714Slinton pc = 0;
905714Slinton curfunc = program;
915714Slinton if (objsize != 0) {
925714Slinton addbp(lastaddr(), END_BP, NIL, NIL, NIL, 0);
935510Slinton }
945714Slinton }
955510Slinton }
965510Slinton
975510Slinton /*
985510Slinton * Note the termination of the program. We do this so as to avoid
995510Slinton * having the process exit, which would make the values of variables
1005510Slinton * inaccessible.
1015510Slinton *
1025510Slinton * Although the END_BP should really be deleted, it is taken
1035510Slinton * care of by fixbps the next time the program runs.
1045510Slinton */
1055510Slinton
endprogram()1065510Slinton endprogram()
1075510Slinton {
1085714Slinton if (ss_variables) {
1095714Slinton prvarnews();
1105714Slinton }
1115714Slinton printf("\nexecution completed\n");
1125714Slinton curfunc = program;
1135761Slinton skimsource(srcfilename(pc));
1145714Slinton curline = lastlinenum;
1155714Slinton erecover();
1165510Slinton }
1175510Slinton
1185510Slinton /*
1195510Slinton * set up what signals we want to trace
1205510Slinton */
1215510Slinton
setsigtrace()1225510Slinton LOCAL setsigtrace()
1235510Slinton {
1245714Slinton register PROCESS *p;
1255510Slinton
1265714Slinton p = process;
1275714Slinton psigtrace(p, SIGINT, TRUE);
1285714Slinton psigtrace(p, SIGTRAP, TRUE);
1295714Slinton psigtrace(p, SIGIOT, TRUE);
1305739Slinton psigtrace(p, SIGILL, TRUE);
1315761Slinton psigtrace(p, SIGBUS, TRUE);
1325510Slinton }
133