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 12*219b2ee8SDavid du Colombier Lsym* 13*219b2ee8SDavid du Colombier unique(char *buf, Sym *s) 14*219b2ee8SDavid du Colombier { 15*219b2ee8SDavid du Colombier Lsym *l; 16*219b2ee8SDavid du Colombier int i, renamed; 17*219b2ee8SDavid du Colombier 18*219b2ee8SDavid du Colombier renamed = 0; 19*219b2ee8SDavid du Colombier strcpy(buf, s->name); 20*219b2ee8SDavid du Colombier for(;;) { 21*219b2ee8SDavid du Colombier l = look(buf); 22*219b2ee8SDavid du Colombier if(l == 0 || (l->lexval == Tid && l->v->set == 0)) 23*219b2ee8SDavid du Colombier break; 24*219b2ee8SDavid du Colombier 25*219b2ee8SDavid du Colombier if(syren == 0 && !quiet) { 26*219b2ee8SDavid du Colombier print("Symbol renames:\n"); 27*219b2ee8SDavid du Colombier syren = 1; 28*219b2ee8SDavid du Colombier } 29*219b2ee8SDavid du Colombier i = strlen(buf)+1; 30*219b2ee8SDavid du Colombier memmove(buf+1, buf, i); 31*219b2ee8SDavid du Colombier buf[0] = '$'; 32*219b2ee8SDavid du Colombier renamed++; 33*219b2ee8SDavid du Colombier if(renamed > 5 && !quiet) { 34*219b2ee8SDavid du Colombier print("Too many renames; must be X source!\n"); 35*219b2ee8SDavid du Colombier break; 36*219b2ee8SDavid du Colombier } 37*219b2ee8SDavid du Colombier } 38*219b2ee8SDavid du Colombier if(renamed && !quiet) 39*219b2ee8SDavid du Colombier print("\t%s=%s %c/%lux\n", s->name, buf, s->type, s->value); 40*219b2ee8SDavid du Colombier if(l == 0) 41*219b2ee8SDavid du Colombier l = enter(buf, Tid); 42*219b2ee8SDavid du Colombier return l; 43*219b2ee8SDavid du Colombier } 44*219b2ee8SDavid 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; 53*219b2ee8SDavid du Colombier char buf[1024]; 54bd389b36SDavid du Colombier List *list, **tail, *l2, *tl; 55bd389b36SDavid du Colombier 56bd389b36SDavid du Colombier tail = &l2; 57*219b2ee8SDavid 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 79*219b2ee8SDavid 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; 84*219b2ee8SDavid 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; 107*219b2ee8SDavid du Colombier if(l2 == 0) 108*219b2ee8SDavid 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; 130bd389b36SDavid du Colombier v->ival = mach->kbase+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 155*219b2ee8SDavid du Colombier void 156*219b2ee8SDavid du Colombier loadvars(void) 157bd389b36SDavid du Colombier { 158*219b2ee8SDavid du Colombier Lsym *l; 159*219b2ee8SDavid du Colombier Value *v; 160*219b2ee8SDavid du Colombier 161*219b2ee8SDavid du Colombier l = mkvar("proc"); 162*219b2ee8SDavid du Colombier v = l->v; 163*219b2ee8SDavid du Colombier v->type = TINT; 164*219b2ee8SDavid du Colombier v->fmt = 'X'; 165*219b2ee8SDavid du Colombier v->set = 1; 166*219b2ee8SDavid du Colombier v->ival = 0; 167*219b2ee8SDavid du Colombier 168*219b2ee8SDavid du Colombier l = mkvar("pid"); /* Current process */ 169*219b2ee8SDavid du Colombier v = l->v; 170*219b2ee8SDavid du Colombier v->type = TINT; 171*219b2ee8SDavid du Colombier v->fmt = 'D'; 172*219b2ee8SDavid du Colombier v->set = 1; 173*219b2ee8SDavid du Colombier v->ival = 0; 174*219b2ee8SDavid du Colombier 175*219b2ee8SDavid du Colombier mkvar("notes"); /* Pending notes */ 176*219b2ee8SDavid du Colombier 177*219b2ee8SDavid du Colombier l = mkvar("proclist"); /* Attached processes */ 178*219b2ee8SDavid du Colombier l->v->type = TLIST; 179*219b2ee8SDavid du Colombier } 180*219b2ee8SDavid du Colombier 181*219b2ee8SDavid du Colombier ulong 182*219b2ee8SDavid du Colombier rget(Map *map, char *reg) 183*219b2ee8SDavid du Colombier { 184*219b2ee8SDavid du Colombier Lsym *s; 185*219b2ee8SDavid du Colombier long x; 186*219b2ee8SDavid du Colombier 187*219b2ee8SDavid du Colombier s = look(reg); 188*219b2ee8SDavid du Colombier if(s == 0) 189*219b2ee8SDavid du Colombier fatal("rget: %s\n", reg); 190*219b2ee8SDavid du Colombier 191*219b2ee8SDavid du Colombier if (get4(map, s->v->ival, &x) < 0) 192*219b2ee8SDavid du Colombier error("can't get register %s: %r\n", reg); 193*219b2ee8SDavid du Colombier return x; 194*219b2ee8SDavid du Colombier } 195*219b2ee8SDavid du Colombier 196*219b2ee8SDavid du Colombier String* 197*219b2ee8SDavid du Colombier strnodlen(char *name, int len) 198*219b2ee8SDavid du Colombier { 199bd389b36SDavid du Colombier String *s; 200bd389b36SDavid du Colombier 201bd389b36SDavid du Colombier s = gmalloc(sizeof(String)+len+1); 202bd389b36SDavid du Colombier s->string = (char*)s+sizeof(String); 203bd389b36SDavid du Colombier s->len = len; 204*219b2ee8SDavid du Colombier if(name != 0) 205*219b2ee8SDavid du Colombier memmove(s->string, name, len); 206*219b2ee8SDavid du Colombier s->string[len] = '\0'; 207*219b2ee8SDavid du Colombier 208*219b2ee8SDavid du Colombier s->gclink = gcl; 209*219b2ee8SDavid du Colombier gcl = s; 210*219b2ee8SDavid du Colombier 211*219b2ee8SDavid du Colombier return s; 212*219b2ee8SDavid du Colombier } 213*219b2ee8SDavid du Colombier 214*219b2ee8SDavid du Colombier String* 215*219b2ee8SDavid du Colombier strnode(char *name) 216*219b2ee8SDavid du Colombier { 217*219b2ee8SDavid du Colombier return strnodlen(name, strlen(name)); 218*219b2ee8SDavid du Colombier } 219*219b2ee8SDavid du Colombier 220*219b2ee8SDavid du Colombier String* 221*219b2ee8SDavid du Colombier runenode(Rune *name) 222*219b2ee8SDavid du Colombier { 223*219b2ee8SDavid du Colombier int len; 224*219b2ee8SDavid du Colombier Rune *p; 225*219b2ee8SDavid du Colombier String *s; 226*219b2ee8SDavid du Colombier 227*219b2ee8SDavid du Colombier p = name; 228*219b2ee8SDavid du Colombier for(len = 0; *p; p++) 229*219b2ee8SDavid du Colombier len++; 230*219b2ee8SDavid du Colombier 231*219b2ee8SDavid du Colombier len++; 232*219b2ee8SDavid du Colombier len *= sizeof(Rune); 233*219b2ee8SDavid du Colombier s = gmalloc(sizeof(String)+len); 234*219b2ee8SDavid du Colombier s->string = (char*)s+sizeof(String); 235*219b2ee8SDavid du Colombier s->len = len; 236*219b2ee8SDavid du Colombier memmove(s->string, name, len); 237bd389b36SDavid du Colombier 238bd389b36SDavid du Colombier s->gclink = gcl; 239bd389b36SDavid du Colombier gcl = s; 240bd389b36SDavid du Colombier 241bd389b36SDavid du Colombier return s; 242bd389b36SDavid du Colombier } 243bd389b36SDavid du Colombier 244bd389b36SDavid du Colombier String* 245bd389b36SDavid du Colombier stradd(String *l, String *r) 246bd389b36SDavid du Colombier { 247bd389b36SDavid du Colombier int len; 248bd389b36SDavid du Colombier String *s; 249bd389b36SDavid du Colombier 250bd389b36SDavid du Colombier len = l->len+r->len; 251bd389b36SDavid du Colombier s = gmalloc(sizeof(String)+len+1); 252bd389b36SDavid du Colombier s->gclink = gcl; 253bd389b36SDavid du Colombier gcl = s; 254bd389b36SDavid du Colombier s->len = len; 255bd389b36SDavid du Colombier s->string = (char*)s+sizeof(String); 256bd389b36SDavid du Colombier memmove(s->string, l->string, l->len); 257bd389b36SDavid du Colombier memmove(s->string+l->len, r->string, r->len); 258bd389b36SDavid du Colombier s->string[s->len] = 0; 259bd389b36SDavid du Colombier return s; 260bd389b36SDavid du Colombier } 261bd389b36SDavid du Colombier 262bd389b36SDavid du Colombier int 263bd389b36SDavid du Colombier scmp(String *sr, String *sl) 264bd389b36SDavid du Colombier { 265bd389b36SDavid du Colombier if(sr->len != sl->len) 266bd389b36SDavid du Colombier return 0; 267bd389b36SDavid du Colombier 268bd389b36SDavid du Colombier if(memcmp(sr->string, sl->string, sl->len)) 269bd389b36SDavid du Colombier return 0; 270bd389b36SDavid du Colombier 271bd389b36SDavid du Colombier return 1; 272bd389b36SDavid du Colombier } 273