Blame


1 84114f06 2004-04-19 devnull /*
2 84114f06 2004-04-19 devnull * functions for running the debugged process
3 84114f06 2004-04-19 devnull */
4 84114f06 2004-04-19 devnull
5 84114f06 2004-04-19 devnull #include "defs.h"
6 84114f06 2004-04-19 devnull #include "fns.h"
7 84114f06 2004-04-19 devnull
8 84114f06 2004-04-19 devnull
9 84114f06 2004-04-19 devnull int child;
10 84114f06 2004-04-19 devnull int msgfd = -1;
11 84114f06 2004-04-19 devnull int notefd = -1;
12 84114f06 2004-04-19 devnull int pcspid = -1;
13 84114f06 2004-04-19 devnull int pcsactive = 0;
14 84114f06 2004-04-19 devnull
15 84114f06 2004-04-19 devnull void
16 84114f06 2004-04-19 devnull setpcs(void)
17 84114f06 2004-04-19 devnull {
18 84114f06 2004-04-19 devnull char buf[128];
19 84114f06 2004-04-19 devnull
20 84114f06 2004-04-19 devnull if(pid && pid != pcspid){
21 84114f06 2004-04-19 devnull if(msgfd >= 0){
22 84114f06 2004-04-19 devnull close(msgfd);
23 84114f06 2004-04-19 devnull msgfd = -1;
24 84114f06 2004-04-19 devnull }
25 84114f06 2004-04-19 devnull if(notefd >= 0){
26 84114f06 2004-04-19 devnull close(notefd);
27 84114f06 2004-04-19 devnull notefd = -1;
28 84114f06 2004-04-19 devnull }
29 84114f06 2004-04-19 devnull pcspid = -1;
30 84114f06 2004-04-19 devnull sprint(buf, "/proc/%d/ctl", pid);
31 84114f06 2004-04-19 devnull msgfd = open(buf, OWRITE);
32 84114f06 2004-04-19 devnull if(msgfd < 0)
33 84114f06 2004-04-19 devnull error("can't open control file");
34 84114f06 2004-04-19 devnull sprint(buf, "/proc/%d/note", pid);
35 84114f06 2004-04-19 devnull notefd = open(buf, ORDWR);
36 84114f06 2004-04-19 devnull if(notefd < 0)
37 84114f06 2004-04-19 devnull error("can't open note file");
38 84114f06 2004-04-19 devnull pcspid = pid;
39 84114f06 2004-04-19 devnull }
40 84114f06 2004-04-19 devnull }
41 84114f06 2004-04-19 devnull
42 84114f06 2004-04-19 devnull void
43 84114f06 2004-04-19 devnull msgpcs(char *msg)
44 84114f06 2004-04-19 devnull {
45 84114f06 2004-04-19 devnull char err[ERRMAX];
46 84114f06 2004-04-19 devnull
47 84114f06 2004-04-19 devnull setpcs();
48 84114f06 2004-04-19 devnull if(write(msgfd, msg, strlen(msg)) < 0 && !ending){
49 84114f06 2004-04-19 devnull errstr(err, sizeof err);
50 84114f06 2004-04-19 devnull if(strcmp(err, "interrupted") != 0)
51 84114f06 2004-04-19 devnull endpcs();
52 84114f06 2004-04-19 devnull errors("can't write control file", err);
53 84114f06 2004-04-19 devnull }
54 84114f06 2004-04-19 devnull }
55 84114f06 2004-04-19 devnull
56 84114f06 2004-04-19 devnull /*
57 84114f06 2004-04-19 devnull * empty the note buffer and toss pending breakpoint notes
58 84114f06 2004-04-19 devnull */
59 84114f06 2004-04-19 devnull void
60 84114f06 2004-04-19 devnull unloadnote(void)
61 84114f06 2004-04-19 devnull {
62 84114f06 2004-04-19 devnull char err[ERRMAX];
63 84114f06 2004-04-19 devnull
64 84114f06 2004-04-19 devnull setpcs();
65 84114f06 2004-04-19 devnull for(; nnote<NNOTE; nnote++){
66 84114f06 2004-04-19 devnull switch(read(notefd, note[nnote], sizeof note[nnote])){
67 84114f06 2004-04-19 devnull case -1:
68 84114f06 2004-04-19 devnull errstr(err, sizeof err);
69 84114f06 2004-04-19 devnull if(strcmp(err, "interrupted") != 0)
70 84114f06 2004-04-19 devnull endpcs();
71 84114f06 2004-04-19 devnull errors("can't read note file", err);
72 84114f06 2004-04-19 devnull case 0:
73 84114f06 2004-04-19 devnull return;
74 84114f06 2004-04-19 devnull }
75 84114f06 2004-04-19 devnull note[nnote][ERRMAX-1] = '\0';
76 84114f06 2004-04-19 devnull if(strncmp(note[nnote], "sys: breakpoint", 15) == 0)
77 84114f06 2004-04-19 devnull --nnote;
78 84114f06 2004-04-19 devnull }
79 84114f06 2004-04-19 devnull }
80 84114f06 2004-04-19 devnull
81 84114f06 2004-04-19 devnull /*
82 84114f06 2004-04-19 devnull * reload the note buffer
83 84114f06 2004-04-19 devnull */
84 84114f06 2004-04-19 devnull void
85 84114f06 2004-04-19 devnull loadnote(void)
86 84114f06 2004-04-19 devnull {
87 84114f06 2004-04-19 devnull int i;
88 84114f06 2004-04-19 devnull char err[ERRMAX];
89 84114f06 2004-04-19 devnull
90 84114f06 2004-04-19 devnull setpcs();
91 84114f06 2004-04-19 devnull for(i=0; i<nnote; i++){
92 84114f06 2004-04-19 devnull if(write(notefd, note[i], strlen(note[i])) < 0){
93 84114f06 2004-04-19 devnull errstr(err, sizeof err);
94 84114f06 2004-04-19 devnull if(strcmp(err, "interrupted") != 0)
95 84114f06 2004-04-19 devnull endpcs();
96 84114f06 2004-04-19 devnull errors("can't write note file", err);
97 84114f06 2004-04-19 devnull }
98 84114f06 2004-04-19 devnull }
99 84114f06 2004-04-19 devnull nnote = 0;
100 84114f06 2004-04-19 devnull }
101 84114f06 2004-04-19 devnull
102 84114f06 2004-04-19 devnull void
103 84114f06 2004-04-19 devnull notes(void)
104 84114f06 2004-04-19 devnull {
105 84114f06 2004-04-19 devnull int n;
106 84114f06 2004-04-19 devnull
107 84114f06 2004-04-19 devnull if(nnote == 0)
108 84114f06 2004-04-19 devnull return;
109 84114f06 2004-04-19 devnull dprint("notes:\n");
110 84114f06 2004-04-19 devnull for(n=0; n<nnote; n++)
111 84114f06 2004-04-19 devnull dprint("%d:\t%s\n", n, note[n]);
112 84114f06 2004-04-19 devnull }
113 84114f06 2004-04-19 devnull
114 84114f06 2004-04-19 devnull void
115 84114f06 2004-04-19 devnull killpcs(void)
116 84114f06 2004-04-19 devnull {
117 84114f06 2004-04-19 devnull msgpcs("kill");
118 84114f06 2004-04-19 devnull }
119 84114f06 2004-04-19 devnull
120 84114f06 2004-04-19 devnull void
121 84114f06 2004-04-19 devnull grab(void)
122 84114f06 2004-04-19 devnull {
123 84114f06 2004-04-19 devnull flush();
124 84114f06 2004-04-19 devnull msgpcs("stop");
125 84114f06 2004-04-19 devnull bpwait();
126 84114f06 2004-04-19 devnull }
127 84114f06 2004-04-19 devnull
128 84114f06 2004-04-19 devnull void
129 84114f06 2004-04-19 devnull ungrab(void)
130 84114f06 2004-04-19 devnull {
131 84114f06 2004-04-19 devnull msgpcs("start");
132 84114f06 2004-04-19 devnull }
133 84114f06 2004-04-19 devnull
134 84114f06 2004-04-19 devnull void
135 84114f06 2004-04-19 devnull doexec(void)
136 84114f06 2004-04-19 devnull {
137 84114f06 2004-04-19 devnull char *argl[MAXARG];
138 84114f06 2004-04-19 devnull char args[LINSIZ];
139 84114f06 2004-04-19 devnull char *p;
140 84114f06 2004-04-19 devnull char **ap;
141 84114f06 2004-04-19 devnull char *thisarg;
142 84114f06 2004-04-19 devnull
143 84114f06 2004-04-19 devnull ap = argl;
144 84114f06 2004-04-19 devnull p = args;
145 84114f06 2004-04-19 devnull *ap++ = symfil;
146 84114f06 2004-04-19 devnull for (rdc(); lastc != EOR;) {
147 84114f06 2004-04-19 devnull thisarg = p;
148 84114f06 2004-04-19 devnull if (lastc == '<' || lastc == '>') {
149 84114f06 2004-04-19 devnull *p++ = lastc;
150 84114f06 2004-04-19 devnull rdc();
151 84114f06 2004-04-19 devnull }
152 84114f06 2004-04-19 devnull while (lastc != EOR && lastc != SPC && lastc != TB) {
153 84114f06 2004-04-19 devnull *p++ = lastc;
154 84114f06 2004-04-19 devnull readchar();
155 84114f06 2004-04-19 devnull }
156 84114f06 2004-04-19 devnull if (lastc == SPC || lastc == TB)
157 84114f06 2004-04-19 devnull rdc();
158 84114f06 2004-04-19 devnull *p++ = 0;
159 84114f06 2004-04-19 devnull if (*thisarg == '<') {
160 84114f06 2004-04-19 devnull close(0);
161 84114f06 2004-04-19 devnull if (open(&thisarg[1], OREAD) < 0) {
162 84114f06 2004-04-19 devnull print("%s: cannot open\n", &thisarg[1]);
163 84114f06 2004-04-19 devnull _exits(0);
164 84114f06 2004-04-19 devnull }
165 84114f06 2004-04-19 devnull }
166 84114f06 2004-04-19 devnull else if (*thisarg == '>') {
167 84114f06 2004-04-19 devnull close(1);
168 84114f06 2004-04-19 devnull if (create(&thisarg[1], OWRITE, 0666) < 0) {
169 84114f06 2004-04-19 devnull print("%s: cannot create\n", &thisarg[1]);
170 84114f06 2004-04-19 devnull _exits(0);
171 84114f06 2004-04-19 devnull }
172 84114f06 2004-04-19 devnull }
173 84114f06 2004-04-19 devnull else
174 84114f06 2004-04-19 devnull *ap++ = thisarg;
175 84114f06 2004-04-19 devnull }
176 84114f06 2004-04-19 devnull *ap = 0;
177 84114f06 2004-04-19 devnull exec(symfil, argl);
178 84114f06 2004-04-19 devnull perror(symfil);
179 84114f06 2004-04-19 devnull }
180 84114f06 2004-04-19 devnull
181 84114f06 2004-04-19 devnull char procname[100];
182 84114f06 2004-04-19 devnull
183 84114f06 2004-04-19 devnull void
184 84114f06 2004-04-19 devnull startpcs(void)
185 84114f06 2004-04-19 devnull {
186 84114f06 2004-04-19 devnull if ((pid = fork()) == 0) {
187 84114f06 2004-04-19 devnull pid = getpid();
188 84114f06 2004-04-19 devnull msgpcs("hang");
189 84114f06 2004-04-19 devnull doexec();
190 84114f06 2004-04-19 devnull exits(0);
191 84114f06 2004-04-19 devnull }
192 84114f06 2004-04-19 devnull
193 84114f06 2004-04-19 devnull if (pid == -1)
194 84114f06 2004-04-19 devnull error("can't fork");
195 84114f06 2004-04-19 devnull child++;
196 84114f06 2004-04-19 devnull sprint(procname, "/proc/%d/mem", pid);
197 84114f06 2004-04-19 devnull corfil = procname;
198 84114f06 2004-04-19 devnull msgpcs("waitstop");
199 84114f06 2004-04-19 devnull bpwait();
200 84114f06 2004-04-19 devnull if (adrflg)
201 84114f06 2004-04-19 devnull rput(correg, mach->pc, adrval);
202 84114f06 2004-04-19 devnull while (rdc() != EOR)
203 84114f06 2004-04-19 devnull ;
204 84114f06 2004-04-19 devnull reread();
205 84114f06 2004-04-19 devnull }
206 84114f06 2004-04-19 devnull
207 84114f06 2004-04-19 devnull void
208 84114f06 2004-04-19 devnull runstep(ulong loc, int keepnote)
209 84114f06 2004-04-19 devnull {
210 84114f06 2004-04-19 devnull int nfoll;
211 443d6288 2012-02-19 rsc ADDR foll[3];
212 84114f06 2004-04-19 devnull BKPT bkpt[3];
213 84114f06 2004-04-19 devnull int i;
214 84114f06 2004-04-19 devnull
215 84114f06 2004-04-19 devnull if(mach->foll == 0){
216 84114f06 2004-04-19 devnull dprint("stepping unimplemented; assuming not a branch\n");
217 84114f06 2004-04-19 devnull nfoll = 1;
218 84114f06 2004-04-19 devnull foll[0] = loc+mach->pcquant;
219 84114f06 2004-04-19 devnull }else {
220 84114f06 2004-04-19 devnull nfoll = mach->foll(cormap, correg, loc, foll);
221 84114f06 2004-04-19 devnull if (nfoll < 0)
222 84114f06 2004-04-19 devnull error("%r");
223 84114f06 2004-04-19 devnull }
224 84114f06 2004-04-19 devnull memset(bkpt, 0, sizeof bkpt);
225 84114f06 2004-04-19 devnull for(i=0; i<nfoll; i++){
226 84114f06 2004-04-19 devnull if(foll[i] == loc)
227 84114f06 2004-04-19 devnull error("can't single step: next instruction is dot");
228 84114f06 2004-04-19 devnull bkpt[i].loc = foll[i];
229 84114f06 2004-04-19 devnull bkput(&bkpt[i], 1);
230 84114f06 2004-04-19 devnull }
231 84114f06 2004-04-19 devnull runrun(keepnote);
232 84114f06 2004-04-19 devnull for(i=0; i<nfoll; i++)
233 84114f06 2004-04-19 devnull bkput(&bkpt[i], 0);
234 84114f06 2004-04-19 devnull }
235 84114f06 2004-04-19 devnull
236 84114f06 2004-04-19 devnull void
237 84114f06 2004-04-19 devnull bpwait(void)
238 84114f06 2004-04-19 devnull {
239 84114f06 2004-04-19 devnull setcor();
240 84114f06 2004-04-19 devnull unloadnote();
241 84114f06 2004-04-19 devnull }
242 84114f06 2004-04-19 devnull
243 84114f06 2004-04-19 devnull void
244 84114f06 2004-04-19 devnull runrun(int keepnote)
245 84114f06 2004-04-19 devnull {
246 84114f06 2004-04-19 devnull int on;
247 84114f06 2004-04-19 devnull
248 84114f06 2004-04-19 devnull on = nnote;
249 84114f06 2004-04-19 devnull unloadnote();
250 84114f06 2004-04-19 devnull if(on != nnote){
251 84114f06 2004-04-19 devnull notes();
252 84114f06 2004-04-19 devnull error("not running: new notes pending");
253 84114f06 2004-04-19 devnull }
254 84114f06 2004-04-19 devnull if(keepnote)
255 84114f06 2004-04-19 devnull loadnote();
256 84114f06 2004-04-19 devnull else
257 84114f06 2004-04-19 devnull nnote = 0;
258 84114f06 2004-04-19 devnull flush();
259 84114f06 2004-04-19 devnull msgpcs("startstop");
260 84114f06 2004-04-19 devnull bpwait();
261 84114f06 2004-04-19 devnull }
262 84114f06 2004-04-19 devnull
263 84114f06 2004-04-19 devnull void
264 84114f06 2004-04-19 devnull bkput(BKPT *bp, int install)
265 84114f06 2004-04-19 devnull {
266 84114f06 2004-04-19 devnull char buf[256];
267 84114f06 2004-04-19 devnull ulong loc;
268 84114f06 2004-04-19 devnull int ret;
269 84114f06 2004-04-19 devnull
270 84114f06 2004-04-19 devnull errstr(buf, sizeof buf);
271 84114f06 2004-04-19 devnull /*
272 84114f06 2004-04-19 devnull if(mach->bpfix)
273 84114f06 2004-04-19 devnull loc = (*mach->bpfix)(bp->loc);
274 84114f06 2004-04-19 devnull else
275 84114f06 2004-04-19 devnull */
276 84114f06 2004-04-19 devnull loc = bp->loc;
277 84114f06 2004-04-19 devnull if(install){
278 84114f06 2004-04-19 devnull ret = get1(cormap, loc, bp->save, mach->bpsize);
279 84114f06 2004-04-19 devnull if (ret > 0)
280 84114f06 2004-04-19 devnull ret = put1(cormap, loc, mach->bpinst, mach->bpsize);
281 84114f06 2004-04-19 devnull }else
282 84114f06 2004-04-19 devnull ret = put1(cormap, loc, bp->save, mach->bpsize);
283 84114f06 2004-04-19 devnull if(ret < 0){
284 84114f06 2004-04-19 devnull sprint(buf, "can't set breakpoint at %#llux: %r", bp->loc);
285 84114f06 2004-04-19 devnull print(buf);
286 84114f06 2004-04-19 devnull read(0, buf, 100);
287 84114f06 2004-04-19 devnull }
288 84114f06 2004-04-19 devnull }