|
|
1.1 root 1: /* Copyright (c) 1982 Regents of the University of California */
2:
3: static char sccsid[] = "@(#)runcont.c 1.5 3/15/82";
4:
5: /*
6: * Execution management.
7: */
8:
9: #include "defs.h"
10: #include <signal.h>
11: #include "process.h"
12: #include "machine.h"
13: #include "object.h"
14: #include "main.h"
15: #include "breakpoint.h"
16: #include "command.h"
17: #include "process.rep"
18:
19: #define MAXNARGS 100 /* maximum number of arguments to RUN */
20:
21: typedef char *String;
22:
23: LOCAL BOOLEAN just_started;
24: LOCAL int argc;
25: LOCAL String argv[MAXNARGS];
26: LOCAL String infile;
27: LOCAL String outfile;
28: LOCAL PROCESS pbuf;
29: PROCESS *process = &pbuf;
30:
31: /*
32: * This is a px-related kludge to deal with the possibility
33: * of object code magically coming from a tmp file.
34: */
35:
36: LOCAL String mode;
37: LOCAL String realname;
38:
39: setargs(m, r)
40: char *m, *r;
41: {
42: mode = m;
43: realname = r;
44: }
45:
46: /*
47: * Initialize the argument list.
48: */
49:
50: arginit()
51: {
52: infile = NIL;
53: outfile = NIL;
54: # if (isvaxpx)
55: argv[0] = mode;
56: argv[1] = objname;
57: if (option('t') && realname == NIL) {
58: argc = 2;
59: } else {
60: argv[2] = realname;
61: argc = 3;
62: }
63: # else
64: argv[0] = objname;
65: argc = 1;
66: # endif
67: }
68:
69: /*
70: * Add an argument to the list for the debuggee.
71: */
72:
73: newarg(arg)
74: String arg;
75: {
76: if (argc >= MAXNARGS) {
77: error("too many arguments to run");
78: }
79: argv[argc++] = arg;
80: }
81:
82: /*
83: * Set the standard input for the debuggee.
84: */
85:
86: inarg(filename)
87: String filename;
88: {
89: if (infile != NIL) {
90: error("multiple input redirects");
91: }
92: infile = filename;
93: }
94:
95: /*
96: * Set the standard output for the debuggee.
97: * Probably should check to avoid overwriting an existing file.
98: */
99:
100: outarg(filename)
101: String filename;
102: {
103: if (outfile != NIL) {
104: error("multiple output redirect");
105: }
106: outfile = filename;
107: }
108:
109: /*
110: * Initial start of the process. The idea is to get it to the point
111: * where the object code has been loaded but execution has not begun.
112: */
113:
114: initstart()
115: {
116: arginit();
117: argv[argc] = NIL;
118: initcache(process);
119: start(argv, infile, outfile);
120: if (process->status != STOPPED) {
121: panic("could not start program");
122: }
123: }
124:
125: /*
126: * Run starts debuggee executing.
127: */
128:
129: run()
130: {
131: fixbps();
132: curline = 0;
133: argv[argc] = NIL;
134: start(argv, infile, outfile);
135: if (process->status == STOPPED) {
136: just_started = TRUE;
137: isstopped = FALSE;
138: cont();
139: } else if (option('r')) {
140: panic("could not start program");
141: }
142: }
143:
144: /*
145: * Continue execution wherever we left off.
146: *
147: * Note that this routine never returns. Eventually bpact() will fail
148: * and we'll call printstatus or step will call it.
149: */
150:
151: typedef int INTFUNC();
152:
153: LOCAL INTFUNC *dbintr;
154: LOCAL intr();
155:
156: #define succeeds == TRUE
157: #define fails == FALSE
158:
159: cont()
160: {
161: dbintr = signal(SIGINT, intr);
162: if (just_started) {
163: just_started = FALSE;
164: } else {
165: if (!isstopped) {
166: error("can't continue execution");
167: }
168: isstopped = FALSE;
169: step();
170: }
171: for (;;) {
172: if (single_stepping) {
173: printnews();
174: } else {
175: setallbps();
176: resume();
177: unsetallbps();
178: if (bpact() fails) {
179: printstatus();
180: }
181: }
182: step();
183: }
184: /* NOTREACHED */
185: }
186:
187: /*
188: * This routine is called if we get an interrupt while "running" px
189: * but actually in the debugger. Could happen, for example, while
190: * processing breakpoints.
191: *
192: * We basically just want to keep going; the assumption is
193: * that when the process resumes it will get the interrupt
194: * which will then be handled.
195: */
196:
197: LOCAL intr()
198: {
199: signal(SIGINT, intr);
200: }
201:
202: fixintr()
203: {
204: signal(SIGINT, dbintr);
205: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.