xref: /inferno-os/utils/acid/util.c (revision e57c7e16a3789cd4de1a3c2560d49b1ee39cd10a)
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*
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
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
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
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
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*
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*
238 strnode(char *name)
239 {
240 	return strnodlen(name, strlen(name));
241 }
242 
243 String*
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*
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
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