]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ki/bpt.c
libtags, zuke: add *.mod support (thanks kemal)
[plan9front.git] / sys / src / cmd / ki / bpt.c
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 "sparc.h"
8
9 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
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
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
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 }