Blame


1 84114f06 2004-04-19 devnull /*
2 84114f06 2004-04-19 devnull * db - main command loop and error/interrupt handling
3 84114f06 2004-04-19 devnull */
4 84114f06 2004-04-19 devnull #include "defs.h"
5 84114f06 2004-04-19 devnull #include "fns.h"
6 84114f06 2004-04-19 devnull
7 84114f06 2004-04-19 devnull int wtflag = OREAD;
8 84114f06 2004-04-19 devnull BOOL kflag;
9 84114f06 2004-04-19 devnull
10 84114f06 2004-04-19 devnull BOOL mkfault;
11 84114f06 2004-04-19 devnull ADDR maxoff;
12 84114f06 2004-04-19 devnull
13 84114f06 2004-04-19 devnull int xargc; /* bullshit */
14 84114f06 2004-04-19 devnull
15 84114f06 2004-04-19 devnull extern BOOL executing;
16 84114f06 2004-04-19 devnull extern int infile;
17 84114f06 2004-04-19 devnull int exitflg;
18 84114f06 2004-04-19 devnull extern int eof;
19 84114f06 2004-04-19 devnull
20 84114f06 2004-04-19 devnull int alldigs(char*);
21 84114f06 2004-04-19 devnull void fault(void*, char*);
22 84114f06 2004-04-19 devnull
23 84114f06 2004-04-19 devnull extern char *Ipath;
24 84114f06 2004-04-19 devnull jmp_buf env;
25 84114f06 2004-04-19 devnull static char *errmsg;
26 84114f06 2004-04-19 devnull
27 84114f06 2004-04-19 devnull Fhdr *symhdr, *corhdr;
28 84114f06 2004-04-19 devnull
29 84114f06 2004-04-19 devnull void
30 84114f06 2004-04-19 devnull usage(void)
31 84114f06 2004-04-19 devnull {
32 84114f06 2004-04-19 devnull fprint(2, "usage: db [-kw] [-m machine] [-I dir] [symfile] [pid]\n");
33 84114f06 2004-04-19 devnull exits("usage");
34 84114f06 2004-04-19 devnull }
35 84114f06 2004-04-19 devnull
36 84114f06 2004-04-19 devnull void
37 84114f06 2004-04-19 devnull main(int argc, char **argv)
38 84114f06 2004-04-19 devnull {
39 84114f06 2004-04-19 devnull int i, omode;
40 84114f06 2004-04-19 devnull char *s;
41 84114f06 2004-04-19 devnull char *name;
42 84114f06 2004-04-19 devnull Fhdr *hdr;
43 84114f06 2004-04-19 devnull
44 84114f06 2004-04-19 devnull name = 0;
45 84114f06 2004-04-19 devnull outputinit();
46 84114f06 2004-04-19 devnull maxoff = MAXOFF;
47 84114f06 2004-04-19 devnull omode = OREAD;
48 84114f06 2004-04-19 devnull ARGBEGIN{
49 84114f06 2004-04-19 devnull default:
50 84114f06 2004-04-19 devnull usage();
51 84114f06 2004-04-19 devnull case 'A':
52 84114f06 2004-04-19 devnull abort();
53 84114f06 2004-04-19 devnull case 'k':
54 84114f06 2004-04-19 devnull kflag = 1;
55 84114f06 2004-04-19 devnull break;
56 84114f06 2004-04-19 devnull case 'w':
57 84114f06 2004-04-19 devnull omode = ORDWR;
58 84114f06 2004-04-19 devnull break;
59 84114f06 2004-04-19 devnull case 'I':
60 84114f06 2004-04-19 devnull s = ARGF();
61 84114f06 2004-04-19 devnull if(s == 0)
62 84114f06 2004-04-19 devnull dprint("missing -I argument\n");
63 84114f06 2004-04-19 devnull else
64 84114f06 2004-04-19 devnull Ipath = s;
65 84114f06 2004-04-19 devnull break;
66 84114f06 2004-04-19 devnull case 'm':
67 84114f06 2004-04-19 devnull name = ARGF();
68 84114f06 2004-04-19 devnull if(name == 0)
69 84114f06 2004-04-19 devnull dprint("missing -m argument\n");
70 84114f06 2004-04-19 devnull break;
71 84114f06 2004-04-19 devnull }ARGEND
72 84114f06 2004-04-19 devnull
73 84114f06 2004-04-19 devnull /*
74 84114f06 2004-04-19 devnull * Unix and Plan 9 differ on what the right order of pid, text, and core is.
75 84114f06 2004-04-19 devnull * I never remember anyway. Let's just accept them in any order.
76 84114f06 2004-04-19 devnull */
77 84114f06 2004-04-19 devnull for(i=0; i<argc; i++){
78 84114f06 2004-04-19 devnull if(alldigs(argv[i])){
79 84114f06 2004-04-19 devnull if(pid){
80 84114f06 2004-04-19 devnull dprint("already have pid %d; ignoring pid %d\n", pid, argv[i]);
81 84114f06 2004-04-19 devnull continue;
82 84114f06 2004-04-19 devnull }
83 84114f06 2004-04-19 devnull if(corhdr){
84 84114f06 2004-04-19 devnull dprint("already have core %s; ignoring pid %d\n", corfil, pid);
85 84114f06 2004-04-19 devnull continue;
86 84114f06 2004-04-19 devnull }
87 84114f06 2004-04-19 devnull pid = atoi(argv[i]);
88 84114f06 2004-04-19 devnull continue;
89 84114f06 2004-04-19 devnull }
90 84114f06 2004-04-19 devnull if((hdr = crackhdr(argv[i], omode)) == nil){
91 84114f06 2004-04-19 devnull dprint("crackhdr %s: %r\n", argv[i]);
92 84114f06 2004-04-19 devnull continue;
93 84114f06 2004-04-19 devnull }
94 84114f06 2004-04-19 devnull dprint("%s: %s %s %s\n", argv[i], hdr->aname, hdr->mname, hdr->fname);
95 84114f06 2004-04-19 devnull if(hdr->ftype == FCORE){
96 84114f06 2004-04-19 devnull if(pid){
97 84114f06 2004-04-19 devnull dprint("already have pid %d; ignoring core %s\n", pid, argv[i]);
98 84114f06 2004-04-19 devnull uncrackhdr(hdr);
99 84114f06 2004-04-19 devnull continue;
100 84114f06 2004-04-19 devnull }
101 84114f06 2004-04-19 devnull if(corhdr){
102 84114f06 2004-04-19 devnull dprint("already have core %s; ignoring core %s\n", corfil, argv[i]);
103 84114f06 2004-04-19 devnull uncrackhdr(hdr);
104 84114f06 2004-04-19 devnull continue;
105 84114f06 2004-04-19 devnull }
106 84114f06 2004-04-19 devnull corhdr = hdr;
107 84114f06 2004-04-19 devnull corfil = argv[i];
108 84114f06 2004-04-19 devnull }else{
109 84114f06 2004-04-19 devnull if(symhdr){
110 84114f06 2004-04-19 devnull dprint("already have text %s; ignoring text %s\n", symfil, argv[i]);
111 84114f06 2004-04-19 devnull uncrackhdr(hdr);
112 84114f06 2004-04-19 devnull continue;
113 84114f06 2004-04-19 devnull }
114 84114f06 2004-04-19 devnull symhdr = hdr;
115 84114f06 2004-04-19 devnull symfil = argv[i];
116 84114f06 2004-04-19 devnull }
117 84114f06 2004-04-19 devnull }
118 84114f06 2004-04-19 devnull
119 84114f06 2004-04-19 devnull if(symhdr==nil){
120 84114f06 2004-04-19 devnull symfil = "a.out";
121 84114f06 2004-04-19 devnull if(pid){
122 84114f06 2004-04-19 devnull if((s = proctextfile(pid)) != nil){
123 84114f06 2004-04-19 devnull dprint("pid %d: text %s\n", pid, s);
124 84114f06 2004-04-19 devnull symfil = s;
125 84114f06 2004-04-19 devnull }
126 84114f06 2004-04-19 devnull }
127 84114f06 2004-04-19 devnull /* XXX pull command from core */
128 84114f06 2004-04-19 devnull
129 84114f06 2004-04-19 devnull if((symhdr = crackhdr(symfil, omode)) == nil){
130 84114f06 2004-04-19 devnull dprint("crackhdr %s: %r\n", symfil);
131 84114f06 2004-04-19 devnull symfil = nil;
132 84114f06 2004-04-19 devnull }
133 84114f06 2004-04-19 devnull }
134 84114f06 2004-04-19 devnull
135 84114f06 2004-04-19 devnull if(!mach)
136 84114f06 2004-04-19 devnull mach = machcpu;
137 84114f06 2004-04-19 devnull
138 84114f06 2004-04-19 devnull /*
139 84114f06 2004-04-19 devnull * Set up maps.
140 84114f06 2004-04-19 devnull */
141 84114f06 2004-04-19 devnull symmap = allocmap();
142 84114f06 2004-04-19 devnull cormap = allocmap();
143 84114f06 2004-04-19 devnull if(symmap == nil || cormap == nil)
144 84114f06 2004-04-19 devnull sysfatal("allocating maps: %r");
145 84114f06 2004-04-19 devnull
146 84114f06 2004-04-19 devnull if(symhdr){
147 84114f06 2004-04-19 devnull if(mapfile(symhdr, 0, symmap, nil) < 0)
148 84114f06 2004-04-19 devnull dprint("mapping %s: %r\n", symfil);
149 84114f06 2004-04-19 devnull mapfile(symhdr, 0, cormap, nil);
150 84114f06 2004-04-19 devnull }
151 84114f06 2004-04-19 devnull
152 84114f06 2004-04-19 devnull dotmap = dumbmap(-1);
153 84114f06 2004-04-19 devnull
154 84114f06 2004-04-19 devnull /*
155 84114f06 2004-04-19 devnull * show initial state and drop into the execution loop.
156 84114f06 2004-04-19 devnull */
157 84114f06 2004-04-19 devnull notify(fault);
158 84114f06 2004-04-19 devnull setsym();
159 84114f06 2004-04-19 devnull if(setjmp(env) == 0){
160 84114f06 2004-04-19 devnull if (pid || corhdr)
161 84114f06 2004-04-19 devnull setcor(); /* could get error */
162 84114f06 2004-04-19 devnull if (correg) {
163 84114f06 2004-04-19 devnull dprint("%s\n", mach->exc(cormap, correg));
164 84114f06 2004-04-19 devnull printpc();
165 84114f06 2004-04-19 devnull }
166 84114f06 2004-04-19 devnull }
167 84114f06 2004-04-19 devnull
168 84114f06 2004-04-19 devnull setjmp(env);
169 84114f06 2004-04-19 devnull if (executing)
170 84114f06 2004-04-19 devnull delbp();
171 84114f06 2004-04-19 devnull executing = FALSE;
172 84114f06 2004-04-19 devnull for (;;) {
173 84114f06 2004-04-19 devnull flushbuf();
174 84114f06 2004-04-19 devnull if (errmsg) {
175 84114f06 2004-04-19 devnull dprint(errmsg);
176 84114f06 2004-04-19 devnull printc('\n');
177 84114f06 2004-04-19 devnull errmsg = 0;
178 84114f06 2004-04-19 devnull exitflg = 0;
179 84114f06 2004-04-19 devnull }
180 84114f06 2004-04-19 devnull if (mkfault) {
181 84114f06 2004-04-19 devnull mkfault=0;
182 84114f06 2004-04-19 devnull printc('\n');
183 84114f06 2004-04-19 devnull prints(DBNAME);
184 84114f06 2004-04-19 devnull }
185 84114f06 2004-04-19 devnull clrinp();
186 84114f06 2004-04-19 devnull rdc();
187 84114f06 2004-04-19 devnull reread();
188 84114f06 2004-04-19 devnull if (eof) {
189 84114f06 2004-04-19 devnull if (infile == STDIN)
190 84114f06 2004-04-19 devnull done();
191 84114f06 2004-04-19 devnull iclose(-1, 0);
192 84114f06 2004-04-19 devnull eof = 0;
193 84114f06 2004-04-19 devnull longjmp(env, 1);
194 84114f06 2004-04-19 devnull }
195 84114f06 2004-04-19 devnull exitflg = 0;
196 84114f06 2004-04-19 devnull command(0, 0);
197 84114f06 2004-04-19 devnull reread();
198 84114f06 2004-04-19 devnull if (rdc() != '\n')
199 84114f06 2004-04-19 devnull error("newline expected");
200 84114f06 2004-04-19 devnull }
201 84114f06 2004-04-19 devnull }
202 84114f06 2004-04-19 devnull
203 84114f06 2004-04-19 devnull int
204 84114f06 2004-04-19 devnull alldigs(char *s)
205 84114f06 2004-04-19 devnull {
206 84114f06 2004-04-19 devnull while(*s){
207 84114f06 2004-04-19 devnull if(*s<'0' || '9'<*s)
208 84114f06 2004-04-19 devnull return 0;
209 84114f06 2004-04-19 devnull s++;
210 84114f06 2004-04-19 devnull }
211 84114f06 2004-04-19 devnull return 1;
212 84114f06 2004-04-19 devnull }
213 84114f06 2004-04-19 devnull
214 84114f06 2004-04-19 devnull void
215 84114f06 2004-04-19 devnull done(void)
216 84114f06 2004-04-19 devnull {
217 84114f06 2004-04-19 devnull if (pid)
218 84114f06 2004-04-19 devnull endpcs();
219 84114f06 2004-04-19 devnull exits(exitflg? "error": 0);
220 84114f06 2004-04-19 devnull }
221 84114f06 2004-04-19 devnull
222 84114f06 2004-04-19 devnull /*
223 84114f06 2004-04-19 devnull * An error occurred; save the message for later printing,
224 84114f06 2004-04-19 devnull * close open files, and reset to main command loop.
225 84114f06 2004-04-19 devnull */
226 84114f06 2004-04-19 devnull void
227 84114f06 2004-04-19 devnull error(char *n)
228 84114f06 2004-04-19 devnull {
229 84114f06 2004-04-19 devnull errmsg = n;
230 84114f06 2004-04-19 devnull iclose(0, 1);
231 84114f06 2004-04-19 devnull oclose();
232 84114f06 2004-04-19 devnull flush();
233 84114f06 2004-04-19 devnull delbp();
234 84114f06 2004-04-19 devnull ending = 0;
235 84114f06 2004-04-19 devnull longjmp(env, 1);
236 84114f06 2004-04-19 devnull }
237 84114f06 2004-04-19 devnull
238 84114f06 2004-04-19 devnull void
239 84114f06 2004-04-19 devnull errors(char *m, char *n)
240 84114f06 2004-04-19 devnull {
241 84114f06 2004-04-19 devnull static char buf[128];
242 84114f06 2004-04-19 devnull
243 84114f06 2004-04-19 devnull sprint(buf, "%s: %s", m, n);
244 84114f06 2004-04-19 devnull error(buf);
245 84114f06 2004-04-19 devnull }
246 84114f06 2004-04-19 devnull
247 84114f06 2004-04-19 devnull /*
248 84114f06 2004-04-19 devnull * An interrupt occurred;
249 84114f06 2004-04-19 devnull * seek to the end of the current file
250 84114f06 2004-04-19 devnull * and remember that there was a fault.
251 84114f06 2004-04-19 devnull */
252 84114f06 2004-04-19 devnull void
253 84114f06 2004-04-19 devnull fault(void *a, char *s)
254 84114f06 2004-04-19 devnull {
255 84114f06 2004-04-19 devnull USED(a);
256 84114f06 2004-04-19 devnull if(strncmp(s, "interrupt", 9) == 0){
257 84114f06 2004-04-19 devnull seek(infile, 0L, 2);
258 84114f06 2004-04-19 devnull mkfault++;
259 84114f06 2004-04-19 devnull noted(NCONT);
260 84114f06 2004-04-19 devnull }
261 84114f06 2004-04-19 devnull noted(NDFLT);
262 84114f06 2004-04-19 devnull }