xref: /plan9/sys/src/cmd/ki/bpt.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <ctype.h>
43e12c5d1SDavid du Colombier #include <bio.h>
5bd389b36SDavid du Colombier #include <mach.h>
63e12c5d1SDavid du Colombier #define Extern extern
73e12c5d1SDavid du Colombier #include "sparc.h"
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier void
dobplist(void)103e12c5d1SDavid du Colombier dobplist(void)
113e12c5d1SDavid du Colombier {
123e12c5d1SDavid du Colombier 	Breakpoint *b;
13*219b2ee8SDavid du Colombier 	char buf[512];
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier 	for(b = bplist; b; b = b->next) {
163e12c5d1SDavid du Colombier 		switch(b->type) {
173e12c5d1SDavid du Colombier 		case Instruction:
183e12c5d1SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:b %d done, at ", b->addr, b->count, b->done);
19*219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CTEXT);
20*219b2ee8SDavid du Colombier 			Bprint(bioout, "%s", buf);
213e12c5d1SDavid du Colombier 			break;
223e12c5d1SDavid du Colombier 
233e12c5d1SDavid du Colombier 		case Access:
243e12c5d1SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:ba %d done, at ", b->addr, b->count, b->done);
25*219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
26*219b2ee8SDavid du Colombier 			Bprint(bioout, "%s", buf);
273e12c5d1SDavid du Colombier 			break;
283e12c5d1SDavid du Colombier 
293e12c5d1SDavid du Colombier 		case Read:
303e12c5d1SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:br %d done, at ", b->addr, b->count, b->done);
31*219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
32*219b2ee8SDavid du Colombier 			Bprint(bioout, "%s", buf);
333e12c5d1SDavid du Colombier 			break;
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier 		case Write:
363e12c5d1SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:bw %d done, at ", b->addr, b->count, b->done);
37*219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
38*219b2ee8SDavid du Colombier 			Bprint(bioout, "%s", buf);
393e12c5d1SDavid du Colombier 			break;
403e12c5d1SDavid du Colombier 
413e12c5d1SDavid du Colombier 		case Equal:
423e12c5d1SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:be at ", b->addr, b->count);
43*219b2ee8SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
44*219b2ee8SDavid du Colombier 			Bprint(bioout, "%s", buf);
453e12c5d1SDavid du Colombier 			break;
463e12c5d1SDavid du Colombier 		}
473e12c5d1SDavid du Colombier 		Bprint(bioout, "\n");
483e12c5d1SDavid du Colombier 	}
493e12c5d1SDavid du Colombier }
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier void
breakpoint(char * addr,char * cp)523e12c5d1SDavid du Colombier breakpoint(char *addr, char *cp)
533e12c5d1SDavid du Colombier {
543e12c5d1SDavid du Colombier 	Breakpoint *b;
553e12c5d1SDavid du Colombier 	int type;
563e12c5d1SDavid du Colombier 
573e12c5d1SDavid du Colombier 	cp = nextc(cp);
583e12c5d1SDavid du Colombier 	type = Instruction;
593e12c5d1SDavid du Colombier 	switch(*cp) {
603e12c5d1SDavid du Colombier 	case 'r':
613e12c5d1SDavid du Colombier 		membpt++;
623e12c5d1SDavid du Colombier 		type = Read;
633e12c5d1SDavid du Colombier 		break;
643e12c5d1SDavid du Colombier 	case 'a':
653e12c5d1SDavid du Colombier 		membpt++;
663e12c5d1SDavid du Colombier 		type = Access;
673e12c5d1SDavid du Colombier 		break;
683e12c5d1SDavid du Colombier 	case 'w':
693e12c5d1SDavid du Colombier 		membpt++;
703e12c5d1SDavid du Colombier 		type = Write;
713e12c5d1SDavid du Colombier 		break;
723e12c5d1SDavid du Colombier 	case 'e':
733e12c5d1SDavid du Colombier 		membpt++;
743e12c5d1SDavid du Colombier 		type = Equal;
753e12c5d1SDavid du Colombier 		break;
763e12c5d1SDavid du Colombier 	}
773e12c5d1SDavid du Colombier 	b = emalloc(sizeof(Breakpoint));
783e12c5d1SDavid du Colombier 	b->addr = expr(addr);
793e12c5d1SDavid du Colombier 	b->type = type;
803e12c5d1SDavid du Colombier 	b->count = cmdcount;
813e12c5d1SDavid du Colombier 	b->done = cmdcount;
823e12c5d1SDavid du Colombier 
833e12c5d1SDavid du Colombier 	b->next = bplist;
843e12c5d1SDavid du Colombier 	bplist = b;
853e12c5d1SDavid du Colombier }
863e12c5d1SDavid du Colombier 
873e12c5d1SDavid du Colombier void
delbpt(char * addr)883e12c5d1SDavid du Colombier delbpt(char *addr)
893e12c5d1SDavid du Colombier {
903e12c5d1SDavid du Colombier 	Breakpoint *b, **l;
913e12c5d1SDavid du Colombier 	ulong baddr;
923e12c5d1SDavid du Colombier 
933e12c5d1SDavid du Colombier 	baddr = expr(addr);
943e12c5d1SDavid du Colombier 	l = &bplist;
953e12c5d1SDavid du Colombier 	for(b = *l; b; b = b->next) {
963e12c5d1SDavid du Colombier 		if(b->addr == baddr) {
973e12c5d1SDavid du Colombier 			if(b->type != Instruction)
983e12c5d1SDavid du Colombier 				membpt++;
993e12c5d1SDavid du Colombier 			*l = b->next;
1003e12c5d1SDavid du Colombier 			free(b);
1013e12c5d1SDavid du Colombier 			return;
1023e12c5d1SDavid du Colombier 		}
1033e12c5d1SDavid du Colombier 		l = &b->next;
1043e12c5d1SDavid du Colombier 	}
1053e12c5d1SDavid du Colombier 
1063e12c5d1SDavid du Colombier 	Bprint(bioout, "no breakpoint\n");
1073e12c5d1SDavid du Colombier }
1083e12c5d1SDavid du Colombier 
1093e12c5d1SDavid du Colombier void
brkchk(ulong addr,int type)1103e12c5d1SDavid du Colombier brkchk(ulong addr, int type)
1113e12c5d1SDavid du Colombier {
1123e12c5d1SDavid du Colombier 	Breakpoint *b;
1133e12c5d1SDavid du Colombier 
1143e12c5d1SDavid du Colombier 	for(b = bplist; b; b = b->next) {
1153e12c5d1SDavid du Colombier 		if(b->addr == addr && (b->type&type)) {
1163e12c5d1SDavid du Colombier 			if(b->type == Equal && getmem_4(addr) == b->count) {
1173e12c5d1SDavid du Colombier 				count = 1;
1183e12c5d1SDavid du Colombier 				atbpt = 1;
1193e12c5d1SDavid du Colombier 				return;
1203e12c5d1SDavid du Colombier 			}
1213e12c5d1SDavid du Colombier 			if(--b->done == 0) {
1223e12c5d1SDavid du Colombier 				b->done = b->count;
1233e12c5d1SDavid du Colombier 				count = 1;
1243e12c5d1SDavid du Colombier 				atbpt = 1;
1253e12c5d1SDavid du Colombier 				return;
1263e12c5d1SDavid du Colombier 			}
1273e12c5d1SDavid du Colombier 		}
1283e12c5d1SDavid du Colombier 	}
1293e12c5d1SDavid du Colombier }
130