Subversion Repositories planix.SVN

Rev

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

Rev Author Line No. Line
2 - 1
/*
2
 *
3
 *	debugger
4
 *
5
 */
6
 
7
#include "defs.h"
8
#include "fns.h"
9
 
10
BKPT *bkpthead;
11
 
12
BOOL bpin;
13
 
14
int pid;
15
int nnote;
16
int ending;
17
char note[NNOTE][ERRMAX];
18
 
19
/* service routines for sub process control */
20
 
21
runpcs(int runmode, int keepnote)
22
{
23
	int rc;
24
	BKPT *bkpt;
25
 
26
	rc = 0;
27
	if (adrflg)
28
		rput(cormap, mach->pc, dot);
29
	dot = rget(cormap, mach->pc);
30
	flush();
31
	while (loopcnt-- > 0) {
32
		if(loopcnt != 0)
33
			printpc();
34
		if (runmode == SINGLE) {
35
			bkpt = scanbkpt(dot);
36
			if (bkpt) {
37
				switch(bkpt->flag){
38
				case BKPTTMP:
39
					bkpt->flag = BKPTCLR;
40
					break;
41
				case BKPTSKIP:
42
					bkpt->flag = BKPTSET;
43
					break;
44
				}
45
			}
46
			runstep(dot, keepnote);
47
		} else {
48
			if ((bkpt = scanbkpt(rget(cormap, mach->pc))) != 0) {
49
				execbkpt(bkpt, keepnote);
50
				keepnote = 0;
51
			}
52
			setbp();
53
			runrun(keepnote);
54
		}
55
		keepnote = 0;
56
		delbp();
57
		dot = rget(cormap, mach->pc);
58
		/* real note? */
59
		if (nnote > 0) {
60
			keepnote = 1;
61
			rc = 0;
62
			continue;
63
		}
64
		bkpt = scanbkpt(dot);
65
		if(bkpt == 0){
66
			keepnote = 0;
67
			rc = 0;
68
			continue;
69
		}
70
		/* breakpoint */
71
		if (bkpt->flag == BKPTTMP)
72
			bkpt->flag = BKPTCLR;
73
		else if (bkpt->flag == BKPTSKIP) {
74
			execbkpt(bkpt, keepnote);
75
			keepnote = 0;
76
			loopcnt++;	/* we didn't really stop */
77
			continue;
78
		}
79
		else {
80
			bkpt->flag = BKPTSKIP;
81
			--bkpt->count;
82
			if ((bkpt->comm[0] == EOR || command(bkpt->comm, ':') != 0)
83
			&&  bkpt->count != 0) {
84
				execbkpt(bkpt, keepnote);
85
				keepnote = 0;
86
				loopcnt++;
87
				continue;
88
			}
89
			bkpt->count = bkpt->initcnt;
90
		}
91
		rc = 1;
92
	}
93
	return(rc);
94
}
95
 
96
/*
97
 * finish the process off;
98
 * kill if still running
99
 */
100
 
101
void
102
endpcs(void)
103
{
104
	BKPT *bk;
105
 
106
	if(ending)
107
		return;
108
	ending = 1;
109
	if (pid) {
110
		if(pcsactive){
111
			killpcs();
112
			pcsactive = 0;
113
		}
114
		pid=0;
115
		nnote=0;
116
		for (bk=bkpthead; bk; bk = bk->nxtbkpt)
117
			if (bk->flag == BKPTTMP)
118
				bk->flag = BKPTCLR;
119
			else if (bk->flag != BKPTCLR)
120
				bk->flag = BKPTSET;
121
	}
122
	bpin = FALSE;
123
	ending = 0;
124
}
125
 
126
/*
127
 * start up the program to be debugged in a child
128
 */
129
 
130
void
131
setup(void)
132
{
133
 
134
	nnote = 0;
135
	startpcs();
136
	bpin = FALSE;
137
	pcsactive = 1;
138
}
139
 
140
/*
141
 * skip over a breakpoint:
142
 * remove breakpoints, then single step
143
 * so we can put it back
144
 */
145
void
146
execbkpt(BKPT *bk, int keepnote)
147
{
148
	runstep(bk->loc, keepnote);
149
	bk->flag = BKPTSET;
150
}
151
 
152
/*
153
 * find the breakpoint at adr, if any
154
 */
155
 
156
BKPT *
157
scanbkpt(ADDR adr)
158
{
159
	BKPT *bk;
160
 
161
	for (bk = bkpthead; bk; bk = bk->nxtbkpt)
162
		if (bk->flag != BKPTCLR && bk->loc == adr)
163
			break;
164
	return(bk);
165
}
166
 
167
/*
168
 * remove all breakpoints from the process' address space
169
 */
170
 
171
void
172
delbp(void)
173
{
174
	BKPT *bk;
175
 
176
	if (bpin == FALSE || pid == 0)
177
		return;
178
	for (bk = bkpthead; bk; bk = bk->nxtbkpt)
179
		if (bk->flag != BKPTCLR)
180
			bkput(bk, 0);
181
	bpin = FALSE;
182
}
183
 
184
/*
185
 * install all the breakpoints
186
 */
187
 
188
void
189
setbp(void)
190
{
191
	BKPT *bk;
192
 
193
	if (bpin == TRUE || pid == 0)
194
		return;
195
	for (bk = bkpthead; bk; bk = bk->nxtbkpt)
196
		if (bk->flag != BKPTCLR)
197
			bkput(bk, 1);
198
	bpin = TRUE;
199
}