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* 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) 39219b2ee8SDavid du Colombier print("\t%s=%s %c/%lux\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 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; 52bd389b36SDavid du Colombier ulong 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 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 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 1817dd7cddfSDavid du Colombier vlong 182219b2ee8SDavid du Colombier rget(Map *map, char *reg) 183219b2ee8SDavid du Colombier { 184219b2ee8SDavid du Colombier Lsym *s; 185219b2ee8SDavid du Colombier long x; 1867dd7cddfSDavid du Colombier vlong 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 1937dd7cddfSDavid du Colombier if(s->v->fmt == 'W') 1947dd7cddfSDavid du Colombier ret = get8(map, (long)s->v->ival, &v); 1957dd7cddfSDavid du Colombier else { 1967dd7cddfSDavid du Colombier ret = get4(map, (long)s->v->ival, &x); 1977dd7cddfSDavid du Colombier v = x; 1987dd7cddfSDavid du Colombier } 1997dd7cddfSDavid du Colombier if(ret < 0) 200219b2ee8SDavid du Colombier error("can't get register %s: %r\n", reg); 2017dd7cddfSDavid du Colombier return v; 202219b2ee8SDavid du Colombier } 203219b2ee8SDavid du Colombier 204219b2ee8SDavid du Colombier String* 205219b2ee8SDavid du Colombier strnodlen(char *name, int len) 206219b2ee8SDavid du Colombier { 207bd389b36SDavid du Colombier String *s; 208bd389b36SDavid du Colombier 209bd389b36SDavid du Colombier s = gmalloc(sizeof(String)+len+1); 210bd389b36SDavid du Colombier s->string = (char*)s+sizeof(String); 211bd389b36SDavid du Colombier s->len = len; 212219b2ee8SDavid du Colombier if(name != 0) 213219b2ee8SDavid du Colombier memmove(s->string, name, len); 214219b2ee8SDavid du Colombier s->string[len] = '\0'; 215219b2ee8SDavid du Colombier 216219b2ee8SDavid du Colombier s->gclink = gcl; 217219b2ee8SDavid du Colombier gcl = s; 218219b2ee8SDavid du Colombier 219219b2ee8SDavid du Colombier return s; 220219b2ee8SDavid du Colombier } 221219b2ee8SDavid du Colombier 222219b2ee8SDavid du Colombier String* 223219b2ee8SDavid du Colombier strnode(char *name) 224219b2ee8SDavid du Colombier { 225219b2ee8SDavid du Colombier return strnodlen(name, strlen(name)); 226219b2ee8SDavid du Colombier } 227219b2ee8SDavid du Colombier 228219b2ee8SDavid du Colombier String* 229219b2ee8SDavid du Colombier runenode(Rune *name) 230219b2ee8SDavid du Colombier { 231219b2ee8SDavid du Colombier int len; 232219b2ee8SDavid du Colombier Rune *p; 233219b2ee8SDavid du Colombier String *s; 234219b2ee8SDavid du Colombier 235219b2ee8SDavid du Colombier p = name; 236219b2ee8SDavid du Colombier for(len = 0; *p; p++) 237219b2ee8SDavid du Colombier len++; 238219b2ee8SDavid du Colombier 239219b2ee8SDavid du Colombier len++; 240219b2ee8SDavid du Colombier len *= sizeof(Rune); 241219b2ee8SDavid du Colombier s = gmalloc(sizeof(String)+len); 242219b2ee8SDavid du Colombier s->string = (char*)s+sizeof(String); 243219b2ee8SDavid du Colombier s->len = len; 244219b2ee8SDavid du Colombier memmove(s->string, name, len); 245bd389b36SDavid du Colombier 246bd389b36SDavid du Colombier s->gclink = gcl; 247bd389b36SDavid du Colombier gcl = s; 248bd389b36SDavid du Colombier 249bd389b36SDavid du Colombier return s; 250bd389b36SDavid du Colombier } 251bd389b36SDavid du Colombier 252bd389b36SDavid du Colombier String* 253bd389b36SDavid du Colombier stradd(String *l, String *r) 254bd389b36SDavid du Colombier { 255bd389b36SDavid du Colombier int len; 256bd389b36SDavid du Colombier String *s; 257bd389b36SDavid du Colombier 258bd389b36SDavid du Colombier len = l->len+r->len; 259bd389b36SDavid du Colombier s = gmalloc(sizeof(String)+len+1); 260bd389b36SDavid du Colombier s->gclink = gcl; 261bd389b36SDavid du Colombier gcl = s; 262bd389b36SDavid du Colombier s->len = len; 263bd389b36SDavid du Colombier s->string = (char*)s+sizeof(String); 264bd389b36SDavid du Colombier memmove(s->string, l->string, l->len); 265bd389b36SDavid du Colombier memmove(s->string+l->len, r->string, r->len); 266bd389b36SDavid du Colombier s->string[s->len] = 0; 267bd389b36SDavid du Colombier return s; 268bd389b36SDavid du Colombier } 269bd389b36SDavid du Colombier 270*ab3dc52fSDavid du Colombier String* 271*ab3dc52fSDavid du Colombier straddrune(String *l, Rune r) 272*ab3dc52fSDavid du Colombier { 273*ab3dc52fSDavid du Colombier int len; 274*ab3dc52fSDavid du Colombier String *s; 275*ab3dc52fSDavid du Colombier 276*ab3dc52fSDavid du Colombier len = l->len+runelen(r); 277*ab3dc52fSDavid du Colombier s = gmalloc(sizeof(String)+len+1); 278*ab3dc52fSDavid du Colombier s->gclink = gcl; 279*ab3dc52fSDavid du Colombier gcl = s; 280*ab3dc52fSDavid du Colombier s->len = len; 281*ab3dc52fSDavid du Colombier s->string = (char*)s+sizeof(String); 282*ab3dc52fSDavid du Colombier memmove(s->string, l->string, l->len); 283*ab3dc52fSDavid du Colombier runetochar(s->string+l->len, &r); 284*ab3dc52fSDavid du Colombier s->string[s->len] = 0; 285*ab3dc52fSDavid du Colombier return s; 286*ab3dc52fSDavid du Colombier } 287*ab3dc52fSDavid du Colombier 288bd389b36SDavid du Colombier int 289bd389b36SDavid du Colombier scmp(String *sr, String *sl) 290bd389b36SDavid du Colombier { 291bd389b36SDavid du Colombier if(sr->len != sl->len) 292bd389b36SDavid du Colombier return 0; 293bd389b36SDavid du Colombier 294bd389b36SDavid du Colombier if(memcmp(sr->string, sl->string, sl->len)) 295bd389b36SDavid du Colombier return 0; 296bd389b36SDavid du Colombier 297bd389b36SDavid du Colombier return 1; 298bd389b36SDavid du Colombier } 299