xref: /plan9/sys/src/cmd/db/runpcs.c (revision 22a127bbfe4dd304949cc596400de973c0138e31)
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 
runpcs(int runmode,int keepnote)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
endpcs(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
setup(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
execbkpt(BKPT * bk,int keepnote)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 *
scanbkpt(ADDR adr)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
delbp(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
setbp(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 }
200