|
|
1.1 root 1: /*
2: *
3: * UNIX debugger
4: *
5: */
6:
7: #include "defs.h"
8:
9: MSG BADEQ;
10: MSG NOMATCH;
11: MSG BADVAR;
12: MSG BADCOM;
13:
14: MAP txtmap;
15: MAP datmap;
16: INT executing;
17: CHAR *lp;
18: INT fcor;
19: INT fsym;
20: INT mkfault;
21: STRING errflg;
22:
23: CHAR lastc;
24: CHAR eqformat[128] = "z";
25: CHAR stformat[128] = "X\"= \"^i";
26:
27: L_INT dot;
28: L_INT ditto;
29: INT dotinc;
30: INT lastcom = '=';
31: L_INT var[];
32: L_INT locval;
33: L_INT locmsk;
34: L_INT pid;
35: L_INT expv;
36: L_INT adrval;
37: INT adrflg;
38: L_INT cntval;
39: INT cntflg;
40:
41:
42:
43:
44: /* command decoding */
45:
46: command(buf,defcom)
47: STRING buf;
48: CHAR defcom;
49: {
50: REG itype, ptype, modifier, regptr;
51: BOOL longpr, eqcom;
52: CHAR wformat[1];
53: CHAR savc;
54: REG L_INT w, savdot;
55: STRING savlp=lp;
56: IF buf
57: THEN IF *buf==EOR
58: THEN return(FALSE);
59: ELSE lp=buf;
60: FI
61: FI
62:
63: REP
64: IF adrflg=expr(0)
65: THEN dot=expv; ditto=dot;
66: FI
67: adrval=dot;
68: IF rdc()==',' ANDF expr(0)
69: THEN cntflg=TRUE; cntval=expv;
70: ELSE cntflg=FALSE; cntval=1; lp--;
71: FI
72:
73: IF !eol(rdc())
74: THEN lastcom=lastc;
75: ELSE IF adrflg==0 THEN dot=inkdot(dotinc); FI
76: lp--; lastcom=defcom;
77: FI
78:
79: switch(lastcom&STRIP) {
80:
81: case '/':
82: itype=DSP; ptype=DSYM;
83: goto trystar;
84:
85: case '=':
86: itype=NSP; ptype=0;
87: goto trypr;
88:
89: case '?':
90: itype=ISP; ptype=ISYM;
91: goto trystar;
92:
93: trystar:
94: IF rdc()=='*' THEN lastcom |= QUOTE; ELSE lp--; FI
95: IF lastcom"E
96: THEN itype |= STAR; ptype = (DSYM+ISYM)-ptype;
97: FI
98:
99: trypr:
100: longpr=FALSE; eqcom=lastcom=='=';
101: switch (rdc()) {
102:
103: case 'm':
104: {/*reset map data*/
105: INT fcount;
106: MAP *smap;
107: UNION{MAP *m; L_INT *mp;}amap;
108:
109: IF eqcom THEN error(BADEQ); FI
110: smap=(itype&DSP?&datmap:&txtmap);
111: amap.m=smap; fcount=3;
112: IF itype&STAR
113: THEN amap.mp += 3;
114: FI
115: WHILE fcount-- ANDF expr(0)
116: DO *(amap.mp)++ = expv; OD
117: IF rdc()=='?' THEN smap->ufd=fsym;
118: ELIF lastc == '/' THEN smap->ufd=fcor;
119: ELSE lp--;
120: FI
121: }
122: break;
123:
124: case 'L':
125: longpr=TRUE;
126: case 'l':
127: /*search for exp*/
128: IF eqcom THEN error(BADEQ); FI
129: dotinc=(longpr?4:2); savdot=dot;
130: expr(1); locval=expv;
131: IF expr(0) THEN locmsk=expv; ELSE locmsk = -1L; FI
132: IF !longpr THEN locmsk &= 0xFFFF; locval &= 0xFFFF; FI
133: LOOP w=get(dot,itype);
134: IF errflg ORF mkfault ORF (w&locmsk)==locval THEN break; FI
135: dot=inkdot(dotinc);
136: POOL
137: IF errflg
138: THEN dot=savdot; errflg=NOMATCH;
139: FI
140: psymoff(dot,ptype,"");
141: break;
142:
143: case 'W':
144: longpr=TRUE;
145: case 'w':
146: IF eqcom THEN error(BADEQ); FI
147: wformat[0]=lastc; expr(1);
148: REP savdot=dot; psymoff(dot,ptype,":%16t"); exform(1,wformat,itype,ptype);
149: errflg=0; dot=savdot;
150: IF longpr
151: THEN put(dot,itype,expv);
152: ELSE put(dot,itype,itol(expv,get(dot,itype)));
153: FI
154: savdot=dot;
155: printf("=%8t"); exform(1,wformat,itype,ptype);
156: printc(EOR);
157: PER expr(0) ANDF errflg==0 DONE
158: dot=savdot;
159: chkerr();
160: break;
161:
162: default:
163: lp--;
164: getformat(eqcom ? eqformat : stformat);
165: IF !eqcom
166: THEN psymoff(dot,ptype,":%16t");
167: FI
168: scanform(cntval,(eqcom?eqformat:stformat),itype,ptype);
169: }
170: break;
171:
172: case '>':
173: lastcom=0; savc=rdc();
1.1.1.2 ! root 174: IF (regptr=getreg(savc)) != -1
1.1 root 175: THEN IF (regptr == ACHI && dot == 0x80000000)
176: THEN printf("0x80000000 is an illegal value for ach\n");
177: break;
178: FI
179: uw[regptr]=dot;
180: ptrace(WUREGS,pid,regptr*NBPW,uw[regptr]);
181: ELIF (modifier=varchk(savc)) != -1
182: THEN var[modifier]=dot;
183: ELSE error(BADVAR);
184: FI
185: break;
186:
187: case '!':
188: lastcom=0;
189: shell(); break;
190:
191: case '$':
192: lastcom=0;
193: printtrace(nextchar()); break;
194:
195: case ':':
196: IF !executing
197: THEN executing=TRUE;
198: subpcs(nextchar());
199: executing=FALSE;
200: lastcom=0;
201: FI
202: break;
203:
204: case 0:
205: printf(DBNAME);
206: break;
207:
208: default: error(BADCOM);
209: }
210:
211: flushbuf();
212: PER rdc()==';' DONE
213: IF buf THEN lp=savlp; ELSE lp--; FI
214: return(adrflg ANDF dot!=0);
215: }
216:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.