static char sccsid
[] = "@(#)runpcs.c 4.1 %G%";
/* service routines for sub process control */
{ return(expr(0) ? expv
: sig
);
IF adrflg THEN userpc
=dot
; FI
printf("%s: running\n", symfil
);
printf("\ncontinue %x %d\n",userpc
,execsig
);
THEN
delbp(); /* hardware handles single-stepping */
ELSE
/* continuing from a breakpoint is hard */
THEN
execbkpt(bkpt
,execsig
); execsig
=0;
ptrace(runmode
,pid
,userpc
,execsig
);
bpwait(); chkerr(); execsig
=0; delbp(); readregs();
IF (signo
==0) ANDF (bkpt
=scanbkpt(userpc
))
THEN
/* stopped by BPT instruction */
printf("\n BPT code; '%s'%o'%o'%d",
bkpt
->comm
,bkpt
->comm
[0],EOR
,bkpt
->flag
);
ORF ((bkpt
->flag
=BKPTEXEC
)
ANDF
command(bkpt
->comm
,':')
THEN
execbkpt(bkpt
,execsig
); execsig
=0; loopcnt
++;
ELSE bkpt
->count
=bkpt
->initcnt
; rc
=1;
ELSE execsig
=signo
; rc
=0;
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(SINGLE
,pid
,bkptr
->loc
,execsig
);
bpwait(); chkerr(); readregs();
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);
exect(symfil
, argl
, environ
);
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
DO IF bkptr
->flag ANDF bkptr
->loc
==adr
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
(bkptr
->ins
&0xFF)|(ptrace(RIUSER
,pid
,a
,0)&~0xFF));
(bkptr
->ins
&0xFF)|(ptrace(RDUSER
,pid
,a
,0)&~0xFF));
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
bkptr
->ins
= ptrace(RIUSER
, pid
, a
, 0);
ptrace(WIUSER
, pid
, a
, BPT
| (bkptr
->ins
&~0xFF));
bkptr
->ins
= ptrace(RDUSER
, pid
, a
, 0);
ptrace(WDUSER
, pid
, a
, BPT
| (bkptr
->ins
&~0xFF));
THEN
prints("cannot set breakpoint: ");
psymoff(bkptr
->loc
,ISYM
,"\n");
WHILE (w
= wait(&stat
))!=pid ANDF w
!= -1 DONE
ELIF (stat
& 0177) != 0177
THEN
prints(" - core dumped");
sigcode
= ptrace(RUREGS
, pid
, &((struct user
*)0)->u_code
, 0);
/*get REG values from pcs*/
DO
*(ADDR
*)(((ADDR
)&u
)+reglist
[i
].roffs
) =
ptrace(RUREGS
, pid
, reglist
[i
].roffs
, 0);
userpc
= *(ADDR
*)(((ADDR
)&u
)+PC
);