xref: /plan9/sys/src/cmd/qi/bpt.c (revision 7d9195a7bc3493d7fc3e1166ef25bf446be66b1a)
1*7d9195a7SDavid du Colombier #include <u.h>
2*7d9195a7SDavid du Colombier #include <libc.h>
3*7d9195a7SDavid du Colombier #include <ctype.h>
4*7d9195a7SDavid du Colombier #include <bio.h>
5*7d9195a7SDavid du Colombier #include <mach.h>
6*7d9195a7SDavid du Colombier #define Extern extern
7*7d9195a7SDavid du Colombier #include "power.h"
8*7d9195a7SDavid du Colombier 
9*7d9195a7SDavid du Colombier void
dobplist(void)10*7d9195a7SDavid du Colombier dobplist(void)
11*7d9195a7SDavid du Colombier {
12*7d9195a7SDavid du Colombier 	Breakpoint *b;
13*7d9195a7SDavid du Colombier 	char buf[512];
14*7d9195a7SDavid du Colombier 
15*7d9195a7SDavid du Colombier 	for(b = bplist; b; b = b->next) {
16*7d9195a7SDavid du Colombier 		switch(b->type) {
17*7d9195a7SDavid du Colombier 		case Instruction:
18*7d9195a7SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:b %d done, at ", b->addr, b->count, b->done);
19*7d9195a7SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CTEXT);
20*7d9195a7SDavid du Colombier 			Bprint(bioout, "%s", buf);
21*7d9195a7SDavid du Colombier 			break;
22*7d9195a7SDavid du Colombier 
23*7d9195a7SDavid du Colombier 		case Access:
24*7d9195a7SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:ba %d done, at ", b->addr, b->count, b->done);
25*7d9195a7SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
26*7d9195a7SDavid du Colombier 			Bprint(bioout, "%s", buf);
27*7d9195a7SDavid du Colombier 			break;
28*7d9195a7SDavid du Colombier 
29*7d9195a7SDavid du Colombier 		case Read:
30*7d9195a7SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:br %d done, at ", b->addr, b->count, b->done);
31*7d9195a7SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
32*7d9195a7SDavid du Colombier 			Bprint(bioout, "%s", buf);
33*7d9195a7SDavid du Colombier 			break;
34*7d9195a7SDavid du Colombier 
35*7d9195a7SDavid du Colombier 		case Write:
36*7d9195a7SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:bw %d done, at ", b->addr, b->count, b->done);
37*7d9195a7SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
38*7d9195a7SDavid du Colombier 			Bprint(bioout, "%s", buf);
39*7d9195a7SDavid du Colombier 			break;
40*7d9195a7SDavid du Colombier 
41*7d9195a7SDavid du Colombier 		case Equal:
42*7d9195a7SDavid du Colombier 			Bprint(bioout, "0x%lux,%d:be at ", b->addr, b->count);
43*7d9195a7SDavid du Colombier 			symoff(buf, sizeof(buf), b->addr, CDATA);
44*7d9195a7SDavid du Colombier 			Bprint(bioout, "%s", buf);
45*7d9195a7SDavid du Colombier 			break;
46*7d9195a7SDavid du Colombier 		}
47*7d9195a7SDavid du Colombier 		Bprint(bioout, "\n");
48*7d9195a7SDavid du Colombier 	}
49*7d9195a7SDavid du Colombier }
50*7d9195a7SDavid du Colombier 
51*7d9195a7SDavid du Colombier void
breakpoint(char * addr,char * cp)52*7d9195a7SDavid du Colombier breakpoint(char *addr, char *cp)
53*7d9195a7SDavid du Colombier {
54*7d9195a7SDavid du Colombier 	Breakpoint *b;
55*7d9195a7SDavid du Colombier 	int type;
56*7d9195a7SDavid du Colombier 
57*7d9195a7SDavid du Colombier 	cp = nextc(cp);
58*7d9195a7SDavid du Colombier 	type = Instruction;
59*7d9195a7SDavid du Colombier 	switch(*cp) {
60*7d9195a7SDavid du Colombier 	case 'r':
61*7d9195a7SDavid du Colombier 		membpt++;
62*7d9195a7SDavid du Colombier 		type = Read;
63*7d9195a7SDavid du Colombier 		break;
64*7d9195a7SDavid du Colombier 	case 'a':
65*7d9195a7SDavid du Colombier 		membpt++;
66*7d9195a7SDavid du Colombier 		type = Access;
67*7d9195a7SDavid du Colombier 		break;
68*7d9195a7SDavid du Colombier 	case 'w':
69*7d9195a7SDavid du Colombier 		membpt++;
70*7d9195a7SDavid du Colombier 		type = Write;
71*7d9195a7SDavid du Colombier 		break;
72*7d9195a7SDavid du Colombier 	case 'e':
73*7d9195a7SDavid du Colombier 		membpt++;
74*7d9195a7SDavid du Colombier 		type = Equal;
75*7d9195a7SDavid du Colombier 		break;
76*7d9195a7SDavid du Colombier 	}
77*7d9195a7SDavid du Colombier 	b = emalloc(sizeof(Breakpoint));
78*7d9195a7SDavid du Colombier 	b->addr = expr(addr);
79*7d9195a7SDavid du Colombier 	b->type = type;
80*7d9195a7SDavid du Colombier 	b->count = cmdcount;
81*7d9195a7SDavid du Colombier 	b->done = cmdcount;
82*7d9195a7SDavid du Colombier 
83*7d9195a7SDavid du Colombier 	b->next = bplist;
84*7d9195a7SDavid du Colombier 	bplist = b;
85*7d9195a7SDavid du Colombier }
86*7d9195a7SDavid du Colombier 
87*7d9195a7SDavid du Colombier void
delbpt(char * addr)88*7d9195a7SDavid du Colombier delbpt(char *addr)
89*7d9195a7SDavid du Colombier {
90*7d9195a7SDavid du Colombier 	Breakpoint *b, **l;
91*7d9195a7SDavid du Colombier 	ulong baddr;
92*7d9195a7SDavid du Colombier 
93*7d9195a7SDavid du Colombier 	baddr = expr(addr);
94*7d9195a7SDavid du Colombier 	l = &bplist;
95*7d9195a7SDavid du Colombier 	for(b = *l; b; b = b->next) {
96*7d9195a7SDavid du Colombier 		if(b->addr == baddr) {
97*7d9195a7SDavid du Colombier 			if(b->type != Instruction)
98*7d9195a7SDavid du Colombier 				membpt++;
99*7d9195a7SDavid du Colombier 			*l = b->next;
100*7d9195a7SDavid du Colombier 			free(b);
101*7d9195a7SDavid du Colombier 			return;
102*7d9195a7SDavid du Colombier 		}
103*7d9195a7SDavid du Colombier 		l = &b->next;
104*7d9195a7SDavid du Colombier 	}
105*7d9195a7SDavid du Colombier 
106*7d9195a7SDavid du Colombier 	Bprint(bioout, "no breakpoint\n");
107*7d9195a7SDavid du Colombier }
108*7d9195a7SDavid du Colombier 
109*7d9195a7SDavid du Colombier void
brkchk(ulong addr,int type)110*7d9195a7SDavid du Colombier brkchk(ulong addr, int type)
111*7d9195a7SDavid du Colombier {
112*7d9195a7SDavid du Colombier 	Breakpoint *b;
113*7d9195a7SDavid du Colombier 
114*7d9195a7SDavid du Colombier 	for(b = bplist; b; b = b->next) {
115*7d9195a7SDavid du Colombier 		if(b->addr == addr && (b->type&type)) {
116*7d9195a7SDavid du Colombier 			if(b->type == Equal && getmem_4(addr) == b->count) {
117*7d9195a7SDavid du Colombier 				count = 1;
118*7d9195a7SDavid du Colombier 				atbpt = 1;
119*7d9195a7SDavid du Colombier 				return;
120*7d9195a7SDavid du Colombier 			}
121*7d9195a7SDavid du Colombier 			if(--b->done == 0) {
122*7d9195a7SDavid du Colombier 				b->done = b->count;
123*7d9195a7SDavid du Colombier 				count = 1;
124*7d9195a7SDavid du Colombier 				atbpt = 1;
125*7d9195a7SDavid du Colombier 				return;
126*7d9195a7SDavid du Colombier 			}
127*7d9195a7SDavid du Colombier 		}
128*7d9195a7SDavid du Colombier 	}
129*7d9195a7SDavid du Colombier }
130