123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632 |
- #include <u.h>
- #include <libc.h>
- #include <ctype.h>
- #include <bio.h>
- #include <mach.h>
- #define Extern extern
- #include "sparc.h"
- char buf[128], lastcmd[128];
- char fmt = 'X';
- int width = 60;
- int inc;
- ulong expr(char*);
- ulong expr1(char*);
- char* term(char*, ulong*);
- char *
- nextc(char *p)
- {
- while(*p && (*p == ' ' || *p == '\t') && *p != '\n')
- p++;
- if(*p == '\n')
- *p = '\0';
- return p;
- }
- char *
- numsym(char *addr, ulong *val)
- {
- char tsym[128], *t;
- static char *delim = "`'<>/\\@*|-~+-/=?\n";
- Symbol s;
- char c;
- t = tsym;
- while(c = *addr) {
- if(strchr(delim, c))
- break;
- *t++ = c;
- addr++;
- }
- t[0] = '\0';
- if(strcmp(tsym, ".") == 0) {
- *val = dot;
- return addr;
- }
- if(lookup(0, tsym, &s))
- *val = s.value;
- else {
- if(tsym[0] == '#')
- *val = strtoul(tsym+1, 0, 16);
- else
- *val = strtoul(tsym, 0, 0);
- }
- return addr;
- }
- ulong
- expr(char *addr)
- {
- ulong t, t2;
- char op;
- if(*addr == '\0')
- return dot;
- addr = numsym(addr, &t);
- if(*addr == '\0')
- return t;
- addr = nextc(addr);
- op = *addr++;
- numsym(addr, &t2);
- switch(op) {
- default:
- Bprint(bioout, "expr syntax\n");
- return 0;
- case '+':
- t += t2;
- break;
- case '-':
- t -= t2;
- break;
- case '%':
- t /= t2;
- break;
- case '&':
- t &= t2;
- break;
- case '|':
- t |= t2;
- break;
- }
- return t;
- }
- int
- buildargv(char *str, char **args, int max)
- {
- int na = 0;
- while (na < max) {
- while((*str == ' ' || *str == '\t' || *str == '\n') && *str != '\0')
- str++;
- if(*str == '\0')
- return na;
- args[na++] = str;
- while(!(*str == ' ' || *str == '\t'|| *str == '\n') && *str != '\0')
- str++;
- if(*str == '\n')
- *str = '\0';
- if(*str == '\0')
- break;
- *str++ = '\0';
- }
- return na;
- }
- void
- colon(char *addr, char *cp)
- {
- int argc;
- char *argv[100];
- char tbuf[512];
- cp = nextc(cp);
- switch(*cp) {
- default:
- Bprint(bioout, "?\n");
- return;
- case 'b':
- breakpoint(addr, cp+1);
- return;
- case 'd':
- delbpt(addr);
- return;
- /* These fall through to print the stopped address */
- case 'r':
- reset();
- argc = buildargv(cp+1, argv, 100);
- initstk(argc, argv);
- count = 0;
- atbpt = 0;
- run();
- break;
- case 'c':
- count = 0;
- atbpt = 0;
- run();
- break;
- case 's':
- cp = nextc(cp+1);
- count = 0;
- if(*cp)
- count = strtoul(cp, 0, 0);
- if(count == 0)
- count = 1;
- atbpt = 0;
- run();
- break;
- }
- dot = reg.pc;
- Bprint(bioout, "%s at #%lux ", atbpt ? "breakpoint" : "stopped", dot);
- symoff(tbuf, sizeof(tbuf), dot, CTEXT);
- Bprint(bioout, tbuf);
- if(fmt == 'z')
- printsource(dot);
- Bprint(bioout, "\n");
- }
- void
- dollar(char *cp)
- {
- cp = nextc(cp);
- switch(*cp) {
- default:
- Bprint(bioout, "?\n");
- break;
- case 'c':
- case 'C':
- stktrace(*cp);
- break;
- case 'b':
- dobplist();
- break;
- case 'r':
- dumpreg();
- break;
- case 'R':
- dumpreg();
- /* fall through */
- case 'f':
- dumpfreg();
- break;
- case 'F':
- dumpdreg();
- break;
- case 'q':
- exits(0);
- break;
- case 'Q':
- isum();
- segsum();
- break;
- case 't':
- cp++;
- switch(*cp) {
- default:
- Bprint(bioout, ":t[0sic]\n");
- break;
- case '\0':
- trace = 1;
- break;
- case '0':
- trace = 0;
- sysdbg = 0;
- calltree = 0;
- break;
- case 's':
- sysdbg = 1;
- break;
- case 'i':
- trace = 1;
- break;
- case 'c':
- calltree = 1;
- break;
- }
- break;
- case 'i':
- cp++;
- switch(*cp) {
- default:
- Bprint(bioout, "$i[isa]\n");
- break;
- case 'i':
- isum();
- break;
- case 's':
- segsum();
- break;
- case 'a':
- isum();
- segsum();
- iprofile();
- break;
- case 'p':
- iprofile();
- break;
- }
- }
- }
- int
- pfmt(char fmt, int mem, ulong val)
- {
- int c, i;
- Symbol s;
- char *p, ch, str[1024];
- c = 0;
- switch(fmt) {
- default:
- Bprint(bioout, "bad modifier\n");
- return 0;
- case 'o':
- c = Bprint(bioout, "%-4lo ", mem ? (ushort)getmem_2(dot) : val);
- inc = 2;
- break;
- case 'O':
- c = Bprint(bioout, "%-8lo ", mem ? getmem_4(dot) : val);
- inc = 4;
- break;
- case 'q':
- c = Bprint(bioout, "%-4lo ", mem ? (short)getmem_2(dot) : val);
- inc = 2;
- break;
- case 'Q':
- c = Bprint(bioout, "%-8lo ", mem ? (long)getmem_4(dot) : val);
- inc = 4;
- break;
- case 'd':
- c = Bprint(bioout, "%-5ld ", mem ? (short)getmem_2(dot) : val);
- inc = 2;
- break;
- case 'D':
- c = Bprint(bioout, "%-8ld ", mem ? (long)getmem_4(dot) : val);
- inc = 4;
- break;
- case 'x':
- c = Bprint(bioout, "#%-4lux ", mem ? (long)getmem_2(dot) : val);
- inc = 2;
- break;
- case 'X':
- c = Bprint(bioout, "#%-8lux ", mem ? (long)getmem_4(dot) : val);
- inc = 4;
- break;
- case 'u':
- c = Bprint(bioout, "%-5ld ", mem ? (ushort)getmem_2(dot) : val);
- inc = 2;
- break;
- case 'U':
- c = Bprint(bioout, "%-8ld ", mem ? (ulong)getmem_4(dot) : val);
- inc = 4;
- break;
- case 'b':
- c = Bprint(bioout, "%-3d ", (int)(mem ? getmem_b(dot) : val));
- inc = 1;
- break;
- case 'c':
- c = Bprint(bioout, "%c ", (int)(mem ? getmem_b(dot) : val));
- inc = 1;
- break;
- case 'C':
- ch = mem ? getmem_b(dot) : val;
- if(isprint(ch))
- c = Bprint(bioout, "%c ", ch);
- else
- c = Bprint(bioout, "\\x%.2x ", ch);
- inc = 1;
- break;
- case 's':
- i = 0;
- while(ch = getmem_b(dot+i))
- str[i++] = ch;
- str[i] = '\0';
- dot += i;
- c = Bprint(bioout, "%s", str);
- inc = 0;
- break;
- case 'S':
- i = 0;
- while(ch = getmem_b(dot+i))
- str[i++] = ch;
- str[i] = '\0';
- dot += i;
- for(p = str; *p; p++)
- if(isprint(*p))
- c += Bprint(bioout, "%c", *p);
- else
- c += Bprint(bioout, "\\x%.2ux", *p);
- inc = 0;
- break;
- case 'Y':
- p = ctime(mem ? getmem_b(dot) : val);
- p[30] = '\0';
- c = Bprint(bioout, "%s", p);
- inc = 4;
- break;
- case 'a':
- symoff(str, sizeof(str), dot, CTEXT);
- Bprint(bioout, "%s", str);
- inc = 0;
- break;
- case 'e':
- for (i = 0; globalsym(&s, i); i++)
- Bprint(bioout, "%-15s #%lux\n", s.name, getmem_4(s.value));
- inc = 0;
- break;
- case 'I':
- case 'i':
- inc = machdata->das(symmap, dot, fmt, str, sizeof(str));
- if (inc < 0) {
- Bprint(bioout, "ki: %r\n");
- return 0;
- }
- c = Bprint(bioout, "\t%s", str);
- break;
- case 'n':
- c = width+1;
- inc = 0;
- break;
- case '-':
- c = 0;
- inc = -1;
- break;
- case '+':
- c = 0;
- inc = 1;
- break;
- case '^':
- c = 0;
- if(inc > 0)
- inc = -inc;
- break;
- case 'z':
- if (findsym(dot, CTEXT, &s))
- Bprint(bioout, " %s() ", s.name);
- printsource(dot);
- inc = 0;
- break;
- }
- return c;
- }
- void
- eval(char *addr, char *p)
- {
- ulong val;
- val = expr(addr);
- p = nextc(p);
- if(*p == '\0') {
- p[0] = fmt;
- p[1] = '\0';
- }
- pfmt(*p, 0, val);
- Bprint(bioout, "\n");
- }
- void
- quesie(char *p)
- {
- int c, count, i;
- char tbuf[512];
- c = 0;
- symoff(tbuf, sizeof(tbuf), dot, CTEXT);
- Bprint(bioout, "%s?\t", tbuf);
- while(*p) {
- p = nextc(p);
- if(*p == '"') {
- for(p++; *p && *p != '"'; p++) {
- Bputc(bioout, *p);
- c++;
- }
- if(*p)
- p++;
- continue;
- }
- count = 0;
- while(*p >= '0' && *p <= '9')
- count = count*10 + (*p++ - '0');
- if(count == 0)
- count = 1;
- p = nextc(p);
- if(*p == '\0') {
- p[0] = fmt;
- p[1] = '\0';
- }
- for(i = 0; i < count; i++) {
- c += pfmt(*p, 1, 0);
- dot += inc;
- if(c > width) {
- Bprint(bioout, "\n");
- symoff(tbuf, sizeof(tbuf), dot, CTEXT);
- Bprint(bioout, "%s?\t", tbuf);
- c = 0;
- }
- }
- fmt = *p++;
- p = nextc(p);
- }
- Bprint(bioout, "\n");
- }
- void
- catcher(void *a, char *msg)
- {
- USED(a);
- if(strcmp(msg, "interrupt") != 0)
- noted(NDFLT);
- count = 1;
- print("ki\n");
- noted(NCONT);
- }
- void
- setreg(char *addr, char *cp)
- {
- int rn;
- dot = expr(addr);
- cp = nextc(cp);
- if(strcmp(cp, "pc") == 0) {
- reg.pc = dot;
- return;
- }
- if(strcmp(cp, "sp") == 0) {
- reg.r[1] = dot;
- return;
- }
- if(strcmp(cp, "y") == 0) {
- reg.Y = dot;
- return;
- }
- if(strcmp(cp, "psr") == 0) {
- reg.psr = dot;
- return;
- }
- if(*cp++ == 'r') {
- rn = strtoul(cp, 0, 10);
- if(rn > 0 && rn < 32) {
- reg.r[rn] = dot;
- return;
- }
- }
- Bprint(bioout, "bad register\n");
- }
- void
- cmd(void)
- {
- char *p, *a, *cp, *gotint;
- char addr[128];
- static char *cmdlet = ":$?/=>";
- int n, i;
- notify(catcher);
- dot = reg.pc;
- setjmp(errjmp);
- for(;;) {
- Bflush(bioout);
- p = buf;
- n = 0;
- for(;;) {
- i = Bgetc(bin);
- if(i < 0)
- exits(0);
- *p++ = i;
- n++;
- if(i == '\n')
- break;
- }
- if(buf[0] == '\n')
- strcpy(buf, lastcmd);
- else {
- buf[n-1] = '\0';
- strcpy(lastcmd, buf);
- }
- p = buf;
- a = addr;
- for(;;) {
- p = nextc(p);
- if(*p == 0 || strchr(cmdlet, *p))
- break;
- *a++ = *p++;
- }
- *a = '\0';
- cmdcount = 1;
- cp = strchr(addr, ',');
- if(cp != 0) {
- if(cp[1] == '#')
- cmdcount = strtoul(cp+2, &gotint, 16);
- else
- cmdcount = strtoul(cp+1, &gotint, 0);
- *cp = '\0';
- }
- switch(*p) {
- case '$':
- dollar(p+1);
- break;
- case ':':
- colon(addr, p+1);
- break;
- case '/':
- case '?':
- dot = expr(addr);
- for(i = 0; i < cmdcount; i++)
- quesie(p+1);
- break;
- case '=':
- eval(addr, p+1);
- break;
- case '>':
- setreg(addr, p+1);
- break;
- default:
- Bprint(bioout, "?\n");
- break;
- }
- }
- }
|