diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/9/port/rdb.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/9/port/rdb.c')
-rwxr-xr-x | sys/src/9/port/rdb.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/sys/src/9/port/rdb.c b/sys/src/9/port/rdb.c new file mode 100755 index 000000000..12977da26 --- /dev/null +++ b/sys/src/9/port/rdb.c @@ -0,0 +1,109 @@ +#include "u.h" +#include "../port/lib.h" +#include "mem.h" +#include "dat.h" +#include "fns.h" +#include "io.h" +#include "ureg.h" + +#define DBG if(0)scrprint +#pragma varargck argpos scrprint 1 +static Ureg ureg; + +static void +scrprint(char *fmt, ...) +{ + char buf[128]; + va_list va; + int n; + + va_start(va, fmt); + n = vseprint(buf, buf+sizeof buf, fmt, va)-buf; + va_end(va); + putstrn(buf, n); +} + +static char* +getline(void) +{ + static char buf[128]; + int i, c; + + for(;;){ + for(i=0; i<nelem(buf) && (c=uartgetc()) != '\n'; i++){ + DBG("%c...", c); + buf[i] = c; + } + + if(i < nelem(buf)){ + buf[i] = 0; + return buf; + } + } +} + +static void* +addr(char *s, Ureg *ureg, char **p) +{ + ulong a; + + a = strtoul(s, p, 16); + if(a < sizeof(Ureg)) + return ((uchar*)ureg)+a; + return (void*)a; +} + +static void +talkrdb(Ureg *ureg) +{ + uchar *a; + char *p, *req; + + serialoq = nil; /* turn off serial console */ + kprintoq = nil; /* turn off /dev/kprint if active */ +// scrprint("Plan 9 debugger\n"); + iprint("Edebugger reset\n"); + for(;;){ + req = getline(); + switch(*req){ + case 'r': + a = addr(req+1, ureg, nil); + DBG("read %p\n", a); + iprint("R%.8lux %.2ux %.2ux %.2ux %.2ux\n", + strtoul(req+1, 0, 16), a[0], a[1], a[2], a[3]); + break; + + case 'w': + a = addr(req+1, ureg, &p); + *(ulong*)a = strtoul(p, nil, 16); + iprint("W\n"); + break; +/* + * case Tmput: + n = min[4]; + if(n > 4){ + mesg(Rerr, Ecount); + break; + } + a = addr(min+0); + scrprint("mput %.8lux\n", a); + memmove(a, min+5, n); + mesg(Rmput, mout); + break; + * + */ + default: + DBG("unknown %c\n", *req); + iprint("Eunknown message\n"); + break; + } + } +} + +void +rdb(void) +{ + splhi(); + iprint("rdb..."); + callwithureg(talkrdb); +} |