|
|
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[] = "@(#)resume.c 5.3 (Berkeley) 1/9/89"; ! 9: #endif not lint ! 10: ! 11: /* ! 12: * Resume execution, first setting appropriate registers. ! 13: */ ! 14: ! 15: #include "defs.h" ! 16: #include <signal.h> ! 17: #include "process.h" ! 18: #include "machine.h" ! 19: #include "main.h" ! 20: #include "process.rep" ! 21: #include "runtime/frame.rep" ! 22: ! 23: #include "machine/pxerrors.h" ! 24: #include "pxinfo.h" ! 25: ! 26: /* ! 27: * Resume execution, set (get) pcode location counter before (after) resuming. ! 28: */ ! 29: ! 30: resume() ! 31: { ! 32: register PROCESS *p; ! 33: ! 34: p = process; ! 35: do { ! 36: if (option('e')) { ! 37: printf("execution resumes at pc 0x%x, lc %d\n", process->pc, pc); ! 38: fflush(stdout); ! 39: } ! 40: pcont(p); ! 41: dread(&pc, PCADDR, sizeof(pc)); /* Get pcode pc */ ! 42: if (option('e')) { ! 43: printf("execution stops at pc 0x%x, lc %d on sig %d\n", ! 44: process->pc, pc, p->signo); ! 45: fflush(stdout); ! 46: } ! 47: } while (p->signo == SIGCONT); ! 48: if (option('r') && p->signo != 0) { ! 49: choose(); ! 50: } ! 51: ! 52: /* ! 53: * If px implements a breakpoint by executing a halt instruction ! 54: * the real pc must be incremented to skip over it. ! 55: * ! 56: * Currently, px sends itself a signal so no incrementing is needed. ! 57: * ! 58: if (isbperr()) { ! 59: p->pc++; ! 60: } ! 61: */ ! 62: } ! 63: ! 64: /* ! 65: * Under the -r option, we offer the opportunity to just get ! 66: * the px traceback and not actually enter the debugger. ! 67: * ! 68: * If the standard input is not a tty but standard error is, ! 69: * change standard input to be /dev/tty. ! 70: */ ! 71: ! 72: LOCAL choose() ! 73: { ! 74: register int c; ! 75: ! 76: if (!isterm(stdin)) { ! 77: if (!isterm(stderr) || freopen("/dev/tty", "r", stdin) == NIL) { ! 78: unsetsigtraces(process); ! 79: pcont(process); ! 80: quit(process->exitval); ! 81: /* NOTREACHED */ ! 82: } ! 83: } ! 84: fprintf(stderr, "\nProgram error"); ! 85: fprintf(stderr, "\nDo you wish to enter the debugger? "); ! 86: c = getchar(); ! 87: if (c == 'n') { ! 88: unsetsigtraces(process); ! 89: pcont(process); ! 90: quit(process->exitval); ! 91: } ! 92: while (c != '\n' && c != EOF) { ! 93: c = getchar(); ! 94: } ! 95: fprintf(stderr, "\nEntering debugger ..."); ! 96: init(); ! 97: option('r') = FALSE; ! 98: fprintf(stderr, " type 'help' for help.\n"); ! 99: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.