xref: /plan9/sys/src/9/port/rdb.c (revision 41dd6b4775bcffc7275c15aee7294944759a2ea7)
17dd7cddfSDavid du Colombier #include "u.h"
27dd7cddfSDavid du Colombier #include "../port/lib.h"
37dd7cddfSDavid du Colombier #include "mem.h"
47dd7cddfSDavid du Colombier #include "dat.h"
57dd7cddfSDavid du Colombier #include "fns.h"
67dd7cddfSDavid du Colombier #include "io.h"
77dd7cddfSDavid du Colombier #include "ureg.h"
87dd7cddfSDavid du Colombier 
97dd7cddfSDavid du Colombier #define DBG	if(0)scrprint
107dd7cddfSDavid du Colombier #pragma varargck argpos scrprint 1
117dd7cddfSDavid du Colombier static Ureg ureg;
127dd7cddfSDavid du Colombier 
137dd7cddfSDavid du Colombier static void
scrprint(char * fmt,...)147dd7cddfSDavid du Colombier scrprint(char *fmt, ...)
157dd7cddfSDavid du Colombier {
167dd7cddfSDavid du Colombier 	char buf[128];
177dd7cddfSDavid du Colombier 	va_list va;
187dd7cddfSDavid du Colombier 	int n;
197dd7cddfSDavid du Colombier 
207dd7cddfSDavid du Colombier 	va_start(va, fmt);
219a747e4fSDavid du Colombier 	n = vseprint(buf, buf+sizeof buf, fmt, va)-buf;
227dd7cddfSDavid du Colombier 	va_end(va);
237dd7cddfSDavid du Colombier 	putstrn(buf, n);
247dd7cddfSDavid du Colombier }
257dd7cddfSDavid du Colombier 
267dd7cddfSDavid du Colombier static char*
getline(void)277dd7cddfSDavid du Colombier getline(void)
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier 	static char buf[128];
307dd7cddfSDavid du Colombier 	int i, c;
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier 	for(;;){
339a747e4fSDavid du Colombier 		for(i=0; i<nelem(buf) && (c=uartgetc()) != '\n'; i++){
347dd7cddfSDavid du Colombier 			DBG("%c...", c);
357dd7cddfSDavid du Colombier 			buf[i] = c;
367dd7cddfSDavid du Colombier 		}
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier 		if(i < nelem(buf)){
397dd7cddfSDavid du Colombier 			buf[i] = 0;
407dd7cddfSDavid du Colombier 			return buf;
417dd7cddfSDavid du Colombier 		}
427dd7cddfSDavid du Colombier 	}
437dd7cddfSDavid du Colombier }
447dd7cddfSDavid du Colombier 
457dd7cddfSDavid du Colombier static void*
addr(char * s,Ureg * ureg,char ** p)4614414594SDavid du Colombier addr(char *s, Ureg *ureg, char **p)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier 	ulong a;
497dd7cddfSDavid du Colombier 
5014414594SDavid du Colombier 	a = strtoul(s, p, 16);
517dd7cddfSDavid du Colombier 	if(a < sizeof(Ureg))
527dd7cddfSDavid du Colombier 		return ((uchar*)ureg)+a;
537dd7cddfSDavid du Colombier 	return (void*)a;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier 
567dd7cddfSDavid du Colombier static void
talkrdb(Ureg * ureg)577dd7cddfSDavid du Colombier talkrdb(Ureg *ureg)
587dd7cddfSDavid du Colombier {
597dd7cddfSDavid du Colombier 	uchar *a;
60*41dd6b47SDavid du Colombier 	char *p, *req;
617dd7cddfSDavid du Colombier 
62*41dd6b47SDavid du Colombier 	serialoq = nil;		/* turn off serial console */
63*41dd6b47SDavid du Colombier 	kprintoq = nil;		/* turn off /dev/kprint if active */
647dd7cddfSDavid du Colombier //	scrprint("Plan 9 debugger\n");
657dd7cddfSDavid du Colombier 	iprint("Edebugger reset\n");
667dd7cddfSDavid du Colombier 	for(;;){
677dd7cddfSDavid du Colombier 		req = getline();
687dd7cddfSDavid du Colombier 		switch(*req){
697dd7cddfSDavid du Colombier 		case 'r':
7014414594SDavid du Colombier 			a = addr(req+1, ureg, nil);
717dd7cddfSDavid du Colombier 			DBG("read %p\n", a);
72*41dd6b47SDavid du Colombier 			iprint("R%.8lux %.2ux %.2ux %.2ux %.2ux\n",
73*41dd6b47SDavid du Colombier 				strtoul(req+1, 0, 16), a[0], a[1], a[2], a[3]);
747dd7cddfSDavid du Colombier 			break;
7514414594SDavid du Colombier 
7614414594SDavid du Colombier 		case 'w':
7714414594SDavid du Colombier 			a = addr(req+1, ureg, &p);
7814414594SDavid du Colombier 			*(ulong*)a = strtoul(p, nil, 16);
7914414594SDavid du Colombier 			iprint("W\n");
8014414594SDavid du Colombier 			break;
817dd7cddfSDavid du Colombier /*
827dd7cddfSDavid du Colombier  *		case Tmput:
837dd7cddfSDavid du Colombier 			n = min[4];
847dd7cddfSDavid du Colombier 			if(n > 4){
857dd7cddfSDavid du Colombier 				mesg(Rerr, Ecount);
867dd7cddfSDavid du Colombier 				break;
877dd7cddfSDavid du Colombier 			}
887dd7cddfSDavid du Colombier 			a = addr(min+0);
897dd7cddfSDavid du Colombier 			scrprint("mput %.8lux\n", a);
907dd7cddfSDavid du Colombier 			memmove(a, min+5, n);
917dd7cddfSDavid du Colombier 			mesg(Rmput, mout);
927dd7cddfSDavid du Colombier 			break;
937dd7cddfSDavid du Colombier  *
947dd7cddfSDavid du Colombier  */
957dd7cddfSDavid du Colombier 		default:
967dd7cddfSDavid du Colombier 			DBG("unknown %c\n", *req);
977dd7cddfSDavid du Colombier 			iprint("Eunknown message\n");
987dd7cddfSDavid du Colombier 			break;
997dd7cddfSDavid du Colombier 		}
1007dd7cddfSDavid du Colombier 	}
1017dd7cddfSDavid du Colombier }
1027dd7cddfSDavid du Colombier 
1037dd7cddfSDavid du Colombier void
rdb(void)1047dd7cddfSDavid du Colombier rdb(void)
1057dd7cddfSDavid du Colombier {
1067dd7cddfSDavid du Colombier 	splhi();
1077dd7cddfSDavid du Colombier 	iprint("rdb...");
1087dd7cddfSDavid du Colombier 	callwithureg(talkrdb);
1097dd7cddfSDavid du Colombier }
110