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