Research V7 development
[unix-history] / usr / src / cmd / adb / runpcs.c
CommitLineData
d94e2462
M
1#
2/*
3 *
4 * UNIX debugger
5 *
6 */
7
8#include "defs.h"
9
10
11MSG NOFORK;
12MSG ENDPCS;
13MSG BADWAIT;
14
15CHAR *lp;
16INT sigint;
17INT sigqit;
18
19/* breakpoints */
20BKPTR bkpthead;
21
22REGLIST reglist[];
23
24CHAR lastc;
25POS corhdr[];
26POS *endhdr;
27
28INT fcor;
29INT fsym;
30STRING errflg;
31INT errno;
32INT signo;
33
34L_INT dot;
35STRING symfil;
36INT wtflag;
37INT pid;
38L_INT expv;
39INT adrflg;
40L_INT loopcnt;
41
42
43
44
45
46/* service routines for sub process control */
47
48getsig(sig)
49{ return(expr(0) ? shorten(expv) : sig);
50}
51
52INT userpc=1;
53
54runpcs(runmode, execsig)
55{
56 INT rc;
57 REG BKPTR bkpt;
58 IF adrflg
59 THEN userpc=shorten(dot);
60 FI
61 setbp();
62 printf("%s: running\n", symfil);
63
64 WHILE (loopcnt--)>0
65 DO
66#ifdef DEBUG
67 printf("\ncontinue %d %d\n",userpc,execsig);
68#endif
69 stty(0,&usrtty);
70 ptrace(runmode,pid,userpc,execsig);
71 bpwait(); chkerr(); readregs();
72
73 /*look for bkpt*/
74 IF signo==0 ANDF (bkpt=scanbkpt(endhdr[pc]-2))
75 THEN /*stopped at bkpt*/
76 userpc=endhdr[pc]=bkpt->loc;
77 IF bkpt->flag==BKPTEXEC
78 ORF ((bkpt->flag=BKPTEXEC, command(bkpt->comm,':')) ANDF --bkpt->count)
79 THEN execbkpt(bkpt); execsig=0; loopcnt++;
80 userpc=1;
81 ELSE bkpt->count=bkpt->initcnt;
82 rc=1;
83 FI
84 ELSE rc=0; execsig=signo; userpc=1;
85 FI
86 OD
87 return(rc);
88}
89
90endpcs()
91{
92 REG BKPTR bkptr;
93 IF pid
94 THEN ptrace(EXIT,pid,0,0); pid=0; userpc=1;
95 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
96 DO IF bkptr->flag
97 THEN bkptr->flag=BKPTSET;
98 FI
99 OD
100 FI
101}
102
103setup()
104{
105 close(fsym); fsym = -1;
106 IF (pid = fork()) == 0
107 THEN ptrace(SETTRC,0,0,0);
108 signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
109 doexec(); exit(0);
110 ELIF pid == -1
111 THEN error(NOFORK);
112 ELSE bpwait(); readregs(); lp[0]=EOR; lp[1]=0;
113 fsym=open(symfil,wtflag);
114 IF errflg
115 THEN printf("%s: cannot execute\n",symfil);
116 endpcs(); error(0);
117 FI
118 FI
119}
120
121execbkpt(bkptr)
122BKPTR bkptr;
123{ INT bkptloc;
124#ifdef DEBUG
125 printf("exbkpt: %d\n",bkptr->count);
126#endif
127 bkptloc = bkptr->loc;
128 ptrace(WIUSER,pid,bkptloc,bkptr->ins);
129 stty(0,&usrtty);
130 ptrace(SINGLE,pid,bkptloc,0);
131 bpwait(); chkerr();
132 ptrace(WIUSER,pid,bkptloc,BPT);
133 bkptr->flag=BKPTSET;
134}
135
136
137doexec()
138{
139 STRING argl[MAXARG];
140 CHAR args[LINSIZ];
141 STRING p, *ap, filnam;
142 ap=argl; p=args;
143 *ap++=symfil;
144 REP IF rdc()==EOR THEN break; FI
145 *ap = p;
146 WHILE lastc!=EOR ANDF lastc!=SP ANDF lastc!=TB DO *p++=lastc; readchar(); OD
147 *p++=0; filnam = *ap+1;
148 IF **ap=='<'
149 THEN close(0);
150 IF open(filnam,0)<0
151 THEN printf("%s: cannot open\n",filnam); exit(0);
152 FI
153 ELIF **ap=='>'
154 THEN close(1);
155 IF creat(filnam,0666)<0
156 THEN printf("%s: cannot create\n",filnam); exit(0);
157 FI
158 ELSE ap++;
159 FI
160 PER lastc!=EOR DONE
161 *ap++=0;
162 execv(symfil, argl);
163}
164
165BKPTR scanbkpt(adr)
166{
167 REG BKPTR bkptr;
168 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
169 DO IF bkptr->flag ANDF bkptr->loc==adr
170 THEN break;
171 FI
172 OD
173 return(bkptr);
174}
175
176delbp()
177{
178 REG INT a;
179 REG BKPTR bkptr;
180 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
181 DO IF bkptr->flag
182 THEN a=bkptr->loc;
183 ptrace(WIUSER,pid,a,bkptr->ins);
184 FI
185 OD
186}
187
188setbp()
189{
190 REG INT a;
191 REG BKPTR bkptr;
192
193 FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
194 DO IF bkptr->flag
195 THEN a = bkptr->loc;
196 bkptr->ins = ptrace(RIUSER, pid, a, 0);
197 ptrace(WIUSER, pid, a, BPT);
198 IF errno
199 THEN prints("cannot set breakpoint: ");
200 psymoff(leng(bkptr->loc),ISYM,"\n");
201 FI
202 FI
203 OD
204}
205
206bpwait()
207{
208 REG INT w;
209 INT stat;
210
211 signal(SIGINT, 1);
212 WHILE (w = wait(&stat))!=pid ANDF w != -1 DONE
213 signal(SIGINT,sigint);
214 gtty(0,&usrtty);
215 stty(0,&adbtty);
216 IF w == -1
217 THEN pid=0;
218 errflg=BADWAIT;
219 ELIF (stat & 0177) != 0177
220 THEN IF signo = stat&0177
221 THEN sigprint();
222 FI
223 IF stat&0200
224 THEN prints(" - core dumped");
225 close(fcor);
226 setcor();
227 FI
228 pid=0;
229 errflg=ENDPCS;
230 ELSE signo = stat>>8;
231 IF signo!=SIGTRC
232 THEN sigprint();
233 ELSE signo=0;
234 FI
235 flushbuf();
236 FI
237}
238
239readregs()
240{
241 /*get REG values from pcs*/
242 REG i;
243 FOR i=0; i<9; i++
244 DO endhdr[reglist[i].roffs] =
245 ptrace(RUREGS, pid, 2*(512+reglist[i].roffs), 0);
246 OD
247
248 /* REALing poINT */
249 FOR i=FROFF; i<FRLEN+FROFF; i++
250 DO corhdr[i] = ptrace(RUREGS,pid,i,0); OD
251}
252
253