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