Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
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
}