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