]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/5i/bpt.c
etheriwl: don't break controller on command flush timeout
[plan9front.git] / sys / src / cmd / 5i / bpt.c
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
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
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
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
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 }