|
|
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[] = "@(#)runcont.c 5.2 (Berkeley) 4/7/87";
9: #endif not lint
10:
11: /*
12: * Execution management.
13: */
14:
15: #include "defs.h"
16: #include <signal.h>
17: #include "process.h"
18: #include "machine.h"
19: #include "object.h"
20: #include "main.h"
21: #include "breakpoint.h"
22: #include "command.h"
23: #include "process.rep"
24:
25: #define MAXNARGS 100 /* maximum number of arguments to RUN */
26:
27: typedef char *String;
28:
29: LOCAL BOOLEAN just_started;
30: LOCAL int argc;
31: LOCAL String argv[MAXNARGS];
32: LOCAL String infile;
33: LOCAL String outfile;
34: LOCAL PROCESS pbuf;
35: PROCESS *process = &pbuf;
36:
37: /*
38: * This is a px-related kludge to deal with the possibility
39: * of object code magically coming from a tmp file.
40: */
41:
42: LOCAL String mode;
43: LOCAL String realname;
44:
45: setargs(m, r)
46: char *m, *r;
47: {
48: mode = m;
49: realname = r;
50: }
51:
52: /*
53: * Initialize the argument list.
54: */
55:
56: arginit()
57: {
58: infile = NIL;
59: outfile = NIL;
60: argv[0] = mode;
61: argv[1] = objname;
62: if (option('t') && realname == NIL) {
63: argc = 2;
64: } else {
65: argv[2] = realname;
66: argc = 3;
67: }
68: }
69:
70: /*
71: * Add an argument to the list for the debuggee.
72: */
73:
74: newarg(arg)
75: String arg;
76: {
77: if (argc >= MAXNARGS) {
78: error("too many arguments to run");
79: }
80: argv[argc++] = arg;
81: }
82:
83: /*
84: * Set the standard input for the debuggee.
85: */
86:
87: inarg(filename)
88: String filename;
89: {
90: if (infile != NIL) {
91: error("multiple input redirects");
92: }
93: infile = filename;
94: }
95:
96: /*
97: * Set the standard output for the debuggee.
98: * Probably should check to avoid overwriting an existing file.
99: */
100:
101: outarg(filename)
102: String filename;
103: {
104: if (outfile != NIL) {
105: error("multiple output redirect");
106: }
107: outfile = filename;
108: }
109:
110: /*
111: * Initial start of the process. The idea is to get it to the point
112: * where the object code has been loaded but execution has not begun.
113: */
114:
115: initstart()
116: {
117: arginit();
118: argv[argc] = NIL;
119: initcache(process);
120: start(argv, infile, outfile);
121: if (process->status != STOPPED) {
122: panic("could not start program");
123: }
124: }
125:
126: /*
127: * Run starts debuggee executing.
128: */
129:
130: run()
131: {
132: fixbps();
133: curline = 0;
134: argv[argc] = NIL;
135: start(argv, infile, outfile);
136: if (process->status == STOPPED) {
137: just_started = TRUE;
138: isstopped = FALSE;
139: cont();
140: } else if (option('r')) {
141: panic("could not start program");
142: }
143: }
144:
145: /*
146: * Continue execution wherever we left off.
147: *
148: * Note that this routine never returns. Eventually bpact() will fail
149: * and we'll call printstatus or step will call it.
150: */
151:
152: typedef int INTFUNC();
153:
154: LOCAL INTFUNC *dbintr;
155: LOCAL intr();
156:
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.