]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/db/runpcs.c
mothra: never snarf the "Go:" box
[plan9front.git] / sys / src / cmd / db / runpcs.c
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 }