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