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