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