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