/* service routines for sub process control */
{ return(expr(0) ? shorten(expv
) : sig
);
THEN userpc
=shorten(dot
);
printf("%s: running\n", symfil
);
printf("\ncontinue %d %d\n",userpc
,execsig
);
ptrace(runmode
,pid
,userpc
,execsig
);
bpwait(); chkerr(); readregs();
IF signo
==0 ANDF (bkpt
=scanbkpt(endhdr
[pc
]-2))
userpc
=endhdr
[pc
]=bkpt
->loc
;
ORF ((bkpt
->flag
=BKPTEXEC
, command(bkpt
->comm
,':')) ANDF
--bkpt
->count
)
THEN
execbkpt(bkpt
); execsig
=0; loopcnt
++;
ELSE bkpt
->count
=bkpt
->initcnt
;
ELSE rc
=0; execsig
=signo
; userpc
=1;
THEN
ptrace(EXIT
,pid
,0,0); pid
=0; userpc
=1;
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
THEN bkptr
->flag
=BKPTSET
;
THEN
ptrace(SETTRC
,0,0,0);
signal(SIGINT
,sigint
); signal(SIGQUIT
,sigqit
);
ELSE
bpwait(); readregs(); lp
[0]=EOR
; lp
[1]=0;
fsym
=open(symfil
,wtflag
);
THEN
printf("%s: cannot execute\n",symfil
);
printf("exbkpt: %d\n",bkptr
->count
);
ptrace(WIUSER
,pid
,bkptloc
,bkptr
->ins
);
ptrace(SINGLE
,pid
,bkptloc
,0);
ptrace(WIUSER
,pid
,bkptloc
,BPT
);
REP IF
rdc()==EOR THEN
break; FI
WHILE lastc
!=EOR ANDF lastc
!=SP ANDF lastc
!=TB DO
*p
++=lastc
; readchar(); OD
THEN
printf("%s: cannot open\n",filnam
); exit(0);
THEN
printf("%s: cannot create\n",filnam
); exit(0);
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
DO IF bkptr
->flag ANDF bkptr
->loc
==adr
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
ptrace(WIUSER
,pid
,a
,bkptr
->ins
);
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
bkptr
->ins
= ptrace(RIUSER
, pid
, a
, 0);
ptrace(WIUSER
, pid
, a
, BPT
);
THEN
prints("cannot set breakpoint: ");
psymoff(leng(bkptr
->loc
),ISYM
,"\n");
WHILE (w
= wait(&stat
))!=pid ANDF w
!= -1 DONE
ELIF (stat
& 0177) != 0177
THEN IF signo
= stat
&0177
THEN
prints(" - core dumped");
/*get REG values from pcs*/
DO endhdr
[reglist
[i
].roffs
] =
ptrace(RUREGS
, pid
, 2*(512+reglist
[i
].roffs
), 0);
FOR i
=FROFF
; i
<FRLEN
+FROFF
; i
++
DO corhdr
[i
] = ptrace(RUREGS
,pid
,i
,0); OD