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