summaryrefslogtreecommitdiff
path: root/sys/src/9/port/rdb.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/9/port/rdb.c109
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);
+}