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