1 #include <lib9.h>
2 #include <bio.h>
3 #include <ctype.h>
4 #include "mach.h"
5 #define Extern extern
6 #include "acid.h"
7 #include "y.tab.h"
8
9 static int syren;
10
11 Lsym*
unique(char * buf,Sym * s)12 unique(char *buf, Sym *s)
13 {
14 Lsym *l;
15 int i, renamed;
16
17 renamed = 0;
18 strcpy(buf, s->name);
19 for(;;) {
20 l = look(buf);
21 if(l == 0 || (l->lexval == Tid && l->v->set == 0))
22 break;
23
24 if(syren == 0 && !quiet) {
25 print("Symbol renames:\n");
26 syren = 1;
27 }
28 i = strlen(buf)+1;
29 memmove(buf+1, buf, i);
30 buf[0] = '$';
31 renamed++;
32 if(renamed > 5 && !quiet) {
33 print("Too many renames; must be X source!\n");
34 break;
35 }
36 }
37 if(renamed && !quiet)
38 print("\t%s=%s %c/%llux\n", s->name, buf, s->type, s->value);
39 if(l == 0)
40 l = enter(buf, Tid);
41 return l;
42 }
43
44 void
varsym(void)45 varsym(void)
46 {
47 int i;
48 Sym *s;
49 long n;
50 Lsym *l;
51 ulong v;
52 char buf[1024];
53 List *list, **tail, *l2, *tl;
54
55 tail = &l2;
56 l2 = 0;
57
58 symbase(&n);
59 for(i = 0; i < n; i++) {
60 s = getsym(i);
61 switch(s->type) {
62 case 'T':
63 case 'L':
64 case 'D':
65 case 'B':
66 case 'b':
67 case 'd':
68 case 'l':
69 case 't':
70 if(s->name[0] == '.')
71 continue;
72
73 v = s->value;
74 tl = al(TLIST);
75 *tail = tl;
76 tail = &tl->next;
77
78 l = unique(buf, s);
79
80 l->v->set = 1;
81 l->v->type = TINT;
82 l->v->vstore.u0.sival = v;
83 if(l->v->vstore.comt == 0)
84 l->v->vstore.fmt = 'X';
85
86 /* Enter as list of { name, type, value } */
87 list = al(TSTRING);
88 tl->lstore.u0.sl = list;
89 list->lstore.u0.sstring = strnode(buf);
90 list->lstore.fmt = 's';
91 list->next = al(TINT);
92 list = list->next;
93 list->lstore.fmt = 'c';
94 list->lstore.u0.sival = s->type;
95 list->next = al(TINT);
96 list = list->next;
97 list->lstore.fmt = 'X';
98 list->lstore.u0.sival = v;
99
100 }
101 }
102 l = mkvar("symbols");
103 l->v->set = 1;
104 l->v->type = TLIST;
105 l->v->vstore.u0.sl = l2;
106 if(l2 == 0)
107 print("no symbol information\n");
108 }
109
110 void
varreg(void)111 varreg(void)
112 {
113 Lsym *l;
114 Value *v;
115 Reglist *r;
116 List **tail, *li;
117
118 l = mkvar("registers");
119 v = l->v;
120 v->set = 1;
121 v->type = TLIST;
122 v->vstore.u0.sl = 0;
123 tail = &v->vstore.u0.sl;
124
125 for(r = mach->reglist; r->rname; r++) {
126 l = mkvar(r->rname);
127 v = l->v;
128 v->set = 1;
129 v->vstore.u0.sival = r->roffs;
130 v->vstore.fmt = r->rformat;
131 v->type = TINT;
132
133 li = al(TSTRING);
134 li->lstore.u0.sstring = strnode(r->rname);
135 li->lstore.fmt = 's';
136 *tail = li;
137 tail = &li->next;
138 }
139
140 if(machdata == 0)
141 return;
142
143 l = mkvar("bpinst"); /* Breakpoint text */
144 v = l->v;
145 v->type = TSTRING;
146 v->vstore.fmt = 's';
147 v->set = 1;
148 v->vstore.u0.sstring = gmalloc(sizeof(String));
149 v->vstore.u0.sstring->len = machdata->bpsize;
150 v->vstore.u0.sstring->string = gmalloc(machdata->bpsize);
151 memmove(v->vstore.u0.sstring->string, machdata->bpinst, machdata->bpsize);
152 }
153
154 void
loadvars(void)155 loadvars(void)
156 {
157 Lsym *l;
158 Value *v;
159
160 l = mkvar("proc");
161 v = l->v;
162 v->type = TINT;
163 v->vstore.fmt = 'X';
164 v->set = 1;
165 v->vstore.u0.sival = 0;
166
167 l = mkvar("pid"); /* Current process */
168 v = l->v;
169 v->type = TINT;
170 v->vstore.fmt = 'D';
171 v->set = 1;
172 v->vstore.u0.sival = 0;
173
174 mkvar("notes"); /* Pending notes */
175
176 l = mkvar("proclist"); /* Attached processes */
177 l->v->type = TLIST;
178
179 l = mkvar("rdebug"); /* remote debugging enabled? */
180 v = l->v;
181 v->type = TINT;
182 v->vstore.fmt = 'D';
183 v->set = 1;
184 v->vstore.u0.sival = rdebug;
185
186 if(rdebug) {
187 l = mkvar("_breakid");
188 v = l->v;
189 v->type = TINT;
190 v->vstore.fmt = 'D';
191 v->set = 1;
192 v->vstore.u0.sival = -1;
193 }
194 }
195
196 uvlong
rget(Map * map,char * reg)197 rget(Map *map, char *reg)
198 {
199 Lsym *s;
200 ulong x;
201 uvlong v;
202 int ret;
203
204 s = look(reg);
205 if(s == 0)
206 fatal("rget: %s\n", reg);
207
208 if(s->v->vstore.fmt == 'Y')
209 ret = get8(map, s->v->vstore.u0.sival, &v);
210 else {
211 ret = get4(map, (long)s->v->vstore.u0.sival, &x);
212 v = x;
213 }
214 if(ret < 0)
215 error("can't get register %s: %r\n", reg);
216 return v;
217 }
218
219 String*
strnodlen(char * name,int len)220 strnodlen(char *name, int len)
221 {
222 String *s;
223
224 s = gmalloc(sizeof(String)+len+1);
225 s->string = (char*)s+sizeof(String);
226 s->len = len;
227 if(name != 0)
228 memmove(s->string, name, len);
229 s->string[len] = '\0';
230
231 s->sgc.gclink = gcl;
232 gcl = &s->sgc;
233
234 return s;
235 }
236
237 String*
strnode(char * name)238 strnode(char *name)
239 {
240 return strnodlen(name, strlen(name));
241 }
242
243 String*
runenode(Rune * name)244 runenode(Rune *name)
245 {
246 int len;
247 Rune *p;
248 String *s;
249
250 p = name;
251 for(len = 0; *p; p++)
252 len++;
253
254 len++;
255 len *= sizeof(Rune);
256 s = gmalloc(sizeof(String)+len);
257 s->string = (char*)s+sizeof(String);
258 s->len = len;
259 memmove(s->string, name, len);
260
261 s->sgc.gclink = gcl;
262 gcl = &s->sgc;
263
264 return s;
265 }
266
267 String*
stradd(String * l,String * r)268 stradd(String *l, String *r)
269 {
270 int len;
271 String *s;
272
273 len = l->len+r->len;
274 s = gmalloc(sizeof(String)+len+1);
275 s->sgc.gclink = gcl;
276 gcl = &s->sgc;
277 s->len = len;
278 s->string = (char*)s+sizeof(String);
279 memmove(s->string, l->string, l->len);
280 memmove(s->string+l->len, r->string, r->len);
281 s->string[s->len] = 0;
282 return s;
283 }
284
285 int
scmp(String * sr,String * sl)286 scmp(String *sr, String *sl)
287 {
288 if(sr->len != sl->len)
289 return 0;
290
291 if(memcmp(sr->string, sl->string, sl->len))
292 return 0;
293
294 return 1;
295 }
296