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