Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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