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