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) 01/09/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 } 100