xref: /plan9-contrib/sys/src/9k/port/rdb.c (revision 9ef1f84b659abcb917c5c090acbce0772e494f21)
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 
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 	delconsdevs();		/* turn off serial console and kprint */
63 //	scrprint("Plan 9 debugger\n");
64 	iprint("Edebugger reset\n");
65 	for(;;){
66 		req = getline();
67 		switch(*req){
68 		case 'r':
69 			a = addr(req+1, ureg, nil);
70 			DBG("read %#p\n", a);
71 			iprint("R%.8lux %.2ux %.2ux %.2ux %.2ux\n",
72 				strtoul(req+1, 0, 16), a[0], a[1], a[2], a[3]);
73 			break;
74 
75 		case 'w':
76 			a = addr(req+1, ureg, &p);
77 			*(ulong*)a = strtoul(p, nil, 16);
78 			iprint("W\n");
79 			break;
80 /*
81  *		case Tmput:
82 			n = min[4];
83 			if(n > 4){
84 				mesg(Rerr, Ecount);
85 				break;
86 			}
87 			a = addr(min+0);
88 			scrprint("mput %.8lux\n", a);
89 			memmove(a, min+5, n);
90 			mesg(Rmput, mout);
91 			break;
92  *
93  */
94 		default:
95 			DBG("unknown %c\n", *req);
96 			iprint("Eunknown message\n");
97 			break;
98 		}
99 	}
100 }
101 
102 void
rdb(void)103 rdb(void)
104 {
105 	splhi();
106 	iprint("rdb...");
107 	callwithureg(talkrdb);
108 }
109