]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/port/rdb.c
kernel: fix fairshare formula in comment (thanks erik)
[plan9front.git] / sys / src / 9 / port / rdb.c
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
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*
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*
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
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
104 rdb(void)
105 {
106         splhi();
107         iprint("rdb...");
108         callwithureg(talkrdb);
109 }