xref: /plan9/sys/src/9/port/rdb.c (revision 41dd6b4775bcffc7275c15aee7294944759a2ea7)
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "io.h"
7 #include "ureg.h"
8 
9 #define DBG	if(0)scrprint
10 #pragma varargck argpos scrprint 1
11 static Ureg ureg;
12 
13 static void
scrprint(char * fmt,...)14 scrprint(char *fmt, ...)
15 {
16 	char buf[128];
17 	va_list va;
18 	int n;
19 
20 	va_start(va, fmt);
21 	n = vseprint(buf, buf+sizeof buf, fmt, va)-buf;
22 	va_end(va);
23 	putstrn(buf, n);
24 }
25 
26 static char*
getline(void)27 getline(void)
28 {
29 	static char buf[128];
30 	int i, c;
31 
32 	for(;;){
33 		for(i=0; i<nelem(buf) && (c=uartgetc()) != '\n'; i++){
34 			DBG("%c...", c);
35 			buf[i] = c;
36 		}
37 
38 		if(i < nelem(buf)){
39 			buf[i] = 0;
40 			return buf;
41 		}
42 	}
43 }
44 
45 static void*
addr(char * s,Ureg * ureg,char ** p)46 addr(char *s, Ureg *ureg, char **p)
47 {
48 	ulong a;
49 
50 	a = strtoul(s, p, 16);
51 	if(a < sizeof(Ureg))
52 		return ((uchar*)ureg)+a;
53 	return (void*)a;
54 }
55 
56 static void
talkrdb(Ureg * ureg)57 talkrdb(Ureg *ureg)
58 {
59 	uchar *a;
60 	char *p, *req;
61 
62 	serialoq = nil;		/* turn off serial console */
63 	kprintoq = nil;		/* turn off /dev/kprint if active */
64 //	scrprint("Plan 9 debugger\n");
65 	iprint("Edebugger reset\n");
66 	for(;;){
67 		req = getline();
68 		switch(*req){
69 		case 'r':
70 			a = addr(req+1, ureg, nil);
71 			DBG("read %p\n", a);
72 			iprint("R%.8lux %.2ux %.2ux %.2ux %.2ux\n",
73 				strtoul(req+1, 0, 16), a[0], a[1], a[2], a[3]);
74 			break;
75 
76 		case 'w':
77 			a = addr(req+1, ureg, &p);
78 			*(ulong*)a = strtoul(p, nil, 16);
79 			iprint("W\n");
80 			break;
81 /*
82  *		case Tmput:
83 			n = min[4];
84 			if(n > 4){
85 				mesg(Rerr, Ecount);
86 				break;
87 			}
88 			a = addr(min+0);
89 			scrprint("mput %.8lux\n", a);
90 			memmove(a, min+5, n);
91 			mesg(Rmput, mout);
92 			break;
93  *
94  */
95 		default:
96 			DBG("unknown %c\n", *req);
97 			iprint("Eunknown message\n");
98 			break;
99 		}
100 	}
101 }
102 
103 void
rdb(void)104 rdb(void)
105 {
106 	splhi();
107 	iprint("rdb...");
108 	callwithureg(talkrdb);
109 }
110