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