1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3bd389b36SDavid du Colombier #include <bio.h>
4bd389b36SDavid du Colombier #include <ctype.h>
5bd389b36SDavid du Colombier #include <mach.h>
6bd389b36SDavid du Colombier #define Extern extern
7bd389b36SDavid du Colombier #include "acid.h"
8bd389b36SDavid du Colombier #include "y.tab.h"
9bd389b36SDavid du Colombier
10bd389b36SDavid du Colombier static int syren;
11bd389b36SDavid du Colombier
12219b2ee8SDavid du Colombier Lsym*
unique(char * buf,Sym * s)13219b2ee8SDavid du Colombier unique(char *buf, Sym *s)
14219b2ee8SDavid du Colombier {
15219b2ee8SDavid du Colombier Lsym *l;
16219b2ee8SDavid du Colombier int i, renamed;
17219b2ee8SDavid du Colombier
18219b2ee8SDavid du Colombier renamed = 0;
19219b2ee8SDavid du Colombier strcpy(buf, s->name);
20219b2ee8SDavid du Colombier for(;;) {
21219b2ee8SDavid du Colombier l = look(buf);
22219b2ee8SDavid du Colombier if(l == 0 || (l->lexval == Tid && l->v->set == 0))
23219b2ee8SDavid du Colombier break;
24219b2ee8SDavid du Colombier
25219b2ee8SDavid du Colombier if(syren == 0 && !quiet) {
26219b2ee8SDavid du Colombier print("Symbol renames:\n");
27219b2ee8SDavid du Colombier syren = 1;
28219b2ee8SDavid du Colombier }
29219b2ee8SDavid du Colombier i = strlen(buf)+1;
30219b2ee8SDavid du Colombier memmove(buf+1, buf, i);
31219b2ee8SDavid du Colombier buf[0] = '$';
32219b2ee8SDavid du Colombier renamed++;
33219b2ee8SDavid du Colombier if(renamed > 5 && !quiet) {
34219b2ee8SDavid du Colombier print("Too many renames; must be X source!\n");
35219b2ee8SDavid du Colombier break;
36219b2ee8SDavid du Colombier }
37219b2ee8SDavid du Colombier }
38219b2ee8SDavid du Colombier if(renamed && !quiet)
394de34a7eSDavid du Colombier print("\t%s=%s %c/%llux\n", s->name, buf, s->type, s->value);
40219b2ee8SDavid du Colombier if(l == 0)
41219b2ee8SDavid du Colombier l = enter(buf, Tid);
42219b2ee8SDavid du Colombier return l;
43219b2ee8SDavid du Colombier }
44219b2ee8SDavid du Colombier
45bd389b36SDavid du Colombier void
varsym(void)46bd389b36SDavid du Colombier varsym(void)
47bd389b36SDavid du Colombier {
48bd389b36SDavid du Colombier int i;
49bd389b36SDavid du Colombier Sym *s;
50bd389b36SDavid du Colombier long n;
51bd389b36SDavid du Colombier Lsym *l;
524de34a7eSDavid du Colombier uvlong v;
53219b2ee8SDavid du Colombier char buf[1024];
54bd389b36SDavid du Colombier List *list, **tail, *l2, *tl;
55bd389b36SDavid du Colombier
56bd389b36SDavid du Colombier tail = &l2;
57219b2ee8SDavid du Colombier l2 = 0;
58bd389b36SDavid du Colombier
59bd389b36SDavid du Colombier symbase(&n);
60bd389b36SDavid du Colombier for(i = 0; i < n; i++) {
61bd389b36SDavid du Colombier s = getsym(i);
62bd389b36SDavid du Colombier switch(s->type) {
63bd389b36SDavid du Colombier case 'T':
64bd389b36SDavid du Colombier case 'L':
65bd389b36SDavid du Colombier case 'D':
66bd389b36SDavid du Colombier case 'B':
67bd389b36SDavid du Colombier case 'b':
68bd389b36SDavid du Colombier case 'd':
69bd389b36SDavid du Colombier case 'l':
70bd389b36SDavid du Colombier case 't':
71bd389b36SDavid du Colombier if(s->name[0] == '.')
72bd389b36SDavid du Colombier continue;
73bd389b36SDavid du Colombier
74bd389b36SDavid du Colombier v = s->value;
75bd389b36SDavid du Colombier tl = al(TLIST);
76bd389b36SDavid du Colombier *tail = tl;
77bd389b36SDavid du Colombier tail = &tl->next;
78bd389b36SDavid du Colombier
79219b2ee8SDavid du Colombier l = unique(buf, s);
80bd389b36SDavid du Colombier
81bd389b36SDavid du Colombier l->v->set = 1;
82bd389b36SDavid du Colombier l->v->type = TINT;
83bd389b36SDavid du Colombier l->v->ival = v;
84219b2ee8SDavid du Colombier if(l->v->comt == 0)
85bd389b36SDavid du Colombier l->v->fmt = 'X';
86bd389b36SDavid du Colombier
87bd389b36SDavid du Colombier /* Enter as list of { name, type, value } */
88bd389b36SDavid du Colombier list = al(TSTRING);
89bd389b36SDavid du Colombier tl->l = list;
90bd389b36SDavid du Colombier list->string = strnode(buf);
91bd389b36SDavid du Colombier list->fmt = 's';
92bd389b36SDavid du Colombier list->next = al(TINT);
93bd389b36SDavid du Colombier list = list->next;
94bd389b36SDavid du Colombier list->fmt = 'c';
95bd389b36SDavid du Colombier list->ival = s->type;
96bd389b36SDavid du Colombier list->next = al(TINT);
97bd389b36SDavid du Colombier list = list->next;
98bd389b36SDavid du Colombier list->fmt = 'X';
99bd389b36SDavid du Colombier list->ival = v;
100bd389b36SDavid du Colombier
101bd389b36SDavid du Colombier }
102bd389b36SDavid du Colombier }
103bd389b36SDavid du Colombier l = mkvar("symbols");
104bd389b36SDavid du Colombier l->v->set = 1;
105bd389b36SDavid du Colombier l->v->type = TLIST;
106bd389b36SDavid du Colombier l->v->l = l2;
107219b2ee8SDavid du Colombier if(l2 == 0)
108219b2ee8SDavid du Colombier print("no symbol information\n");
109bd389b36SDavid du Colombier }
110bd389b36SDavid du Colombier
111bd389b36SDavid du Colombier void
varreg(void)112bd389b36SDavid du Colombier varreg(void)
113bd389b36SDavid du Colombier {
114bd389b36SDavid du Colombier Lsym *l;
115bd389b36SDavid du Colombier Value *v;
116bd389b36SDavid du Colombier Reglist *r;
117bd389b36SDavid du Colombier List **tail, *li;
118bd389b36SDavid du Colombier
119bd389b36SDavid du Colombier l = mkvar("registers");
120bd389b36SDavid du Colombier v = l->v;
121bd389b36SDavid du Colombier v->set = 1;
122bd389b36SDavid du Colombier v->type = TLIST;
123bd389b36SDavid du Colombier v->l = 0;
124bd389b36SDavid du Colombier tail = &v->l;
125bd389b36SDavid du Colombier
126bd389b36SDavid du Colombier for(r = mach->reglist; r->rname; r++) {
127bd389b36SDavid du Colombier l = mkvar(r->rname);
128bd389b36SDavid du Colombier v = l->v;
129bd389b36SDavid du Colombier v->set = 1;
1307dd7cddfSDavid du Colombier v->ival = r->roffs;
131bd389b36SDavid du Colombier v->fmt = r->rformat;
132bd389b36SDavid du Colombier v->type = TINT;
133bd389b36SDavid du Colombier
134bd389b36SDavid du Colombier li = al(TSTRING);
135bd389b36SDavid du Colombier li->string = strnode(r->rname);
136bd389b36SDavid du Colombier li->fmt = 's';
137bd389b36SDavid du Colombier *tail = li;
138bd389b36SDavid du Colombier tail = &li->next;
139bd389b36SDavid du Colombier }
140bd389b36SDavid du Colombier
141bd389b36SDavid du Colombier if(machdata == 0)
142bd389b36SDavid du Colombier return;
143bd389b36SDavid du Colombier
144bd389b36SDavid du Colombier l = mkvar("bpinst"); /* Breakpoint text */
145bd389b36SDavid du Colombier v = l->v;
146bd389b36SDavid du Colombier v->type = TSTRING;
147bd389b36SDavid du Colombier v->fmt = 's';
148bd389b36SDavid du Colombier v->set = 1;
149bd389b36SDavid du Colombier v->string = gmalloc(sizeof(String));
150bd389b36SDavid du Colombier v->string->len = machdata->bpsize;
151bd389b36SDavid du Colombier v->string->string = gmalloc(machdata->bpsize);
152bd389b36SDavid du Colombier memmove(v->string->string, machdata->bpinst, machdata->bpsize);
153bd389b36SDavid du Colombier }
154bd389b36SDavid du Colombier
155219b2ee8SDavid du Colombier void
loadvars(void)156219b2ee8SDavid du Colombier loadvars(void)
157bd389b36SDavid du Colombier {
158219b2ee8SDavid du Colombier Lsym *l;
159219b2ee8SDavid du Colombier Value *v;
160219b2ee8SDavid du Colombier
161219b2ee8SDavid du Colombier l = mkvar("proc");
162219b2ee8SDavid du Colombier v = l->v;
163219b2ee8SDavid du Colombier v->type = TINT;
164219b2ee8SDavid du Colombier v->fmt = 'X';
165219b2ee8SDavid du Colombier v->set = 1;
166219b2ee8SDavid du Colombier v->ival = 0;
167219b2ee8SDavid du Colombier
168219b2ee8SDavid du Colombier l = mkvar("pid"); /* Current process */
169219b2ee8SDavid du Colombier v = l->v;
170219b2ee8SDavid du Colombier v->type = TINT;
171219b2ee8SDavid du Colombier v->fmt = 'D';
172219b2ee8SDavid du Colombier v->set = 1;
173219b2ee8SDavid du Colombier v->ival = 0;
174219b2ee8SDavid du Colombier
175219b2ee8SDavid du Colombier mkvar("notes"); /* Pending notes */
176219b2ee8SDavid du Colombier
177219b2ee8SDavid du Colombier l = mkvar("proclist"); /* Attached processes */
178219b2ee8SDavid du Colombier l->v->type = TLIST;
179219b2ee8SDavid du Colombier }
180219b2ee8SDavid du Colombier
1814de34a7eSDavid du Colombier uvlong
rget(Map * map,char * reg)182219b2ee8SDavid du Colombier rget(Map *map, char *reg)
183219b2ee8SDavid du Colombier {
184219b2ee8SDavid du Colombier Lsym *s;
1854de34a7eSDavid du Colombier ulong x;
1864de34a7eSDavid du Colombier uvlong v;
1877dd7cddfSDavid du Colombier int ret;
188219b2ee8SDavid du Colombier
189219b2ee8SDavid du Colombier s = look(reg);
190219b2ee8SDavid du Colombier if(s == 0)
191219b2ee8SDavid du Colombier fatal("rget: %s\n", reg);
192219b2ee8SDavid du Colombier
193*1bd28109SDavid du Colombier switch(s->v->fmt){
194*1bd28109SDavid du Colombier default:
1954de34a7eSDavid du Colombier ret = get4(map, s->v->ival, &x);
1967dd7cddfSDavid du Colombier v = x;
197*1bd28109SDavid du Colombier break;
198*1bd28109SDavid du Colombier case 'V':
199*1bd28109SDavid du Colombier case 'W':
200*1bd28109SDavid du Colombier case 'Y':
201*1bd28109SDavid du Colombier case 'Z':
202*1bd28109SDavid du Colombier ret = get8(map, s->v->ival, &v);
203*1bd28109SDavid du Colombier break;
2047dd7cddfSDavid du Colombier }
2057dd7cddfSDavid du Colombier if(ret < 0)
206219b2ee8SDavid du Colombier error("can't get register %s: %r\n", reg);
2077dd7cddfSDavid du Colombier return v;
208219b2ee8SDavid du Colombier }
209219b2ee8SDavid du Colombier
210219b2ee8SDavid du Colombier String*
strnodlen(char * name,int len)211219b2ee8SDavid du Colombier strnodlen(char *name, int len)
212219b2ee8SDavid du Colombier {
213bd389b36SDavid du Colombier String *s;
214bd389b36SDavid du Colombier
215bd389b36SDavid du Colombier s = gmalloc(sizeof(String)+len+1);
216bd389b36SDavid du Colombier s->string = (char*)s+sizeof(String);
217bd389b36SDavid du Colombier s->len = len;
218219b2ee8SDavid du Colombier if(name != 0)
219219b2ee8SDavid du Colombier memmove(s->string, name, len);
220219b2ee8SDavid du Colombier s->string[len] = '\0';
221219b2ee8SDavid du Colombier
222219b2ee8SDavid du Colombier s->gclink = gcl;
223219b2ee8SDavid du Colombier gcl = s;
224219b2ee8SDavid du Colombier
225219b2ee8SDavid du Colombier return s;
226219b2ee8SDavid du Colombier }
227219b2ee8SDavid du Colombier
228219b2ee8SDavid du Colombier String*
strnode(char * name)229219b2ee8SDavid du Colombier strnode(char *name)
230219b2ee8SDavid du Colombier {
231219b2ee8SDavid du Colombier return strnodlen(name, strlen(name));
232219b2ee8SDavid du Colombier }
233219b2ee8SDavid du Colombier
234219b2ee8SDavid du Colombier String*
runenode(Rune * name)235219b2ee8SDavid du Colombier runenode(Rune *name)
236219b2ee8SDavid du Colombier {
237219b2ee8SDavid du Colombier int len;
238219b2ee8SDavid du Colombier Rune *p;
239219b2ee8SDavid du Colombier String *s;
240219b2ee8SDavid du Colombier
241219b2ee8SDavid du Colombier p = name;
242219b2ee8SDavid du Colombier for(len = 0; *p; p++)
243219b2ee8SDavid du Colombier len++;
244219b2ee8SDavid du Colombier
245219b2ee8SDavid du Colombier len++;
246219b2ee8SDavid du Colombier len *= sizeof(Rune);
247219b2ee8SDavid du Colombier s = gmalloc(sizeof(String)+len);
248219b2ee8SDavid du Colombier s->string = (char*)s+sizeof(String);
249219b2ee8SDavid du Colombier s->len = len;
250219b2ee8SDavid du Colombier memmove(s->string, name, len);
251bd389b36SDavid du Colombier
252bd389b36SDavid du Colombier s->gclink = gcl;
253bd389b36SDavid du Colombier gcl = s;
254bd389b36SDavid du Colombier
255bd389b36SDavid du Colombier return s;
256bd389b36SDavid du Colombier }
257bd389b36SDavid du Colombier
258bd389b36SDavid du Colombier String*
stradd(String * l,String * r)259bd389b36SDavid du Colombier stradd(String *l, String *r)
260bd389b36SDavid du Colombier {
261bd389b36SDavid du Colombier int len;
262bd389b36SDavid du Colombier String *s;
263bd389b36SDavid du Colombier
264bd389b36SDavid du Colombier len = l->len+r->len;
265bd389b36SDavid du Colombier s = gmalloc(sizeof(String)+len+1);
266bd389b36SDavid du Colombier s->gclink = gcl;
267bd389b36SDavid du Colombier gcl = s;
268bd389b36SDavid du Colombier s->len = len;
269bd389b36SDavid du Colombier s->string = (char*)s+sizeof(String);
270bd389b36SDavid du Colombier memmove(s->string, l->string, l->len);
271bd389b36SDavid du Colombier memmove(s->string+l->len, r->string, r->len);
272bd389b36SDavid du Colombier s->string[s->len] = 0;
273bd389b36SDavid du Colombier return s;
274bd389b36SDavid du Colombier }
275bd389b36SDavid du Colombier
276ab3dc52fSDavid du Colombier String*
straddrune(String * l,Rune r)277ab3dc52fSDavid du Colombier straddrune(String *l, Rune r)
278ab3dc52fSDavid du Colombier {
279ab3dc52fSDavid du Colombier int len;
280ab3dc52fSDavid du Colombier String *s;
281ab3dc52fSDavid du Colombier
282ab3dc52fSDavid du Colombier len = l->len+runelen(r);
283ab3dc52fSDavid du Colombier s = gmalloc(sizeof(String)+len+1);
284ab3dc52fSDavid du Colombier s->gclink = gcl;
285ab3dc52fSDavid du Colombier gcl = s;
286ab3dc52fSDavid du Colombier s->len = len;
287ab3dc52fSDavid du Colombier s->string = (char*)s+sizeof(String);
288ab3dc52fSDavid du Colombier memmove(s->string, l->string, l->len);
289ab3dc52fSDavid du Colombier runetochar(s->string+l->len, &r);
290ab3dc52fSDavid du Colombier s->string[s->len] = 0;
291ab3dc52fSDavid du Colombier return s;
292ab3dc52fSDavid du Colombier }
293ab3dc52fSDavid du Colombier
294bd389b36SDavid du Colombier int
scmp(String * sr,String * sl)295bd389b36SDavid du Colombier scmp(String *sr, String *sl)
296bd389b36SDavid du Colombier {
297bd389b36SDavid du Colombier if(sr->len != sl->len)
298bd389b36SDavid du Colombier return 0;
299bd389b36SDavid du Colombier
300bd389b36SDavid du Colombier if(memcmp(sr->string, sl->string, sl->len))
301bd389b36SDavid du Colombier return 0;
302bd389b36SDavid du Colombier
303bd389b36SDavid du Colombier return 1;
304bd389b36SDavid du Colombier }
305