static char sccsid
[] = "@(#)runpcs.c 4.1 %G%";
IF adrflg THEN userpc
=dot
; FI
if (debug
) 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();
loop1
: IF (signo
==0) ANDF (bkpt
=scanbkpt(userpc
))
THEN
/* stopped by BPT instruction */
if (debug
) printf("\n BPT code; '%s'%o'%o'%d",
bkpt
->comm
,bkpt
->comm
[0],EOR
,bkpt
->flag
);
THEN
acommand(bkpt
->comm
);
ORF ((bkpt
->flag
=BKPTEXEC
)
THEN
execbkpt(bkpt
,execsig
); execsig
=0; loopcnt
++;
ELSE bkpt
->flag
=BKPTSET
; bkpt
->count
=bkpt
->initcnt
;
if (debug
) printf("Returning from runpcs\n");
if (debug
) printf("Entering endpcs with pid=%d\n");
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
);
if (debug
) printf("About to doexec pid=%d\n",pid
);
ELSE
bpwait(); readregs();
if (debug
) printf("About to open symfil = %s\n", symfil
);
fsym
=open(symfil
,wtflag
);
THEN
printf("%s: cannot execute\n",symfil
);
if (debug
) printf("%d %s\n", errflg
, errflg
);
if (debug
) printf("exbkpt: %d\n",bkptr
->count
);
ptrace(SINGLE
,pid
,bkptr
->loc
,execsig
);
bpwait(); chkerr(); readregs();
char *argl
[MAXARG
], args
[LINSIZ
];
register char c
, redchar
, *argsp
, **arglp
, *filnam
;
while (eqany(c
, " \t")) {
} while (eqany(c
, " \t"));
} while (!eqany(c
, " <>\t\n"));
if (open(filnam
,0) < 0) {
printf("%s: cannot open\n",filnam
);
if (creat(filnam
,0666) < 0) {
printf("%s: cannot create\n",filnam
);
} while(!eqany(c
, " <>\t\n"));
printf("About to exect(%s, %d, %d)\n",symfil
,argl
,environ
);
for (dap
= argl
; *dap
; dap
++) {
exect(symfil
, argl
, environ
);
perror("Returned from exect");
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));
FOR bkptr
=bkpthead
; bkptr
; bkptr
=bkptr
->nxtbkpt
bkptr
->ins
= ptrace(RIUSER
, pid
, a
, 0);
ptrace(WIUSER
, pid
, a
, BPT
| (bkptr
->ins
&~0xFF));
THEN
error("cannot set breakpoint: ");
printf("%s:%d @ %d\n", adrtoprocp(dot
)->pname
,
if (debug
) printf("Waiting for pid %d\n",pid
);
WHILE (w
= wait(&stat
))!=pid ANDF w
!= -1 DONE
if (debug
) printf("Ending wait\n");
if (debug
) printf("w = %d; pid = %d; stat = %o;\n", w
,pid
,stat
);
ELIF (stat
& 0177) != 0177
THEN IF signo
= stat
&0177
THEN
error(" - core dumped");
if (debug
) printf("PC = %d, dbsubn = %d\n",
ptrace(RUREGS
, pid
, PC
, 0), extaddr("_dbsubn"));
ptrace(RUREGS
, pid
, PC
, 0) != extaddr("_dbsubn")
/*get REG values from pcs*/
DO
*(ADDR
*)(((ADDR
)&u
)+reglist
[i
].roffs
) =
ptrace(RUREGS
, pid
, reglist
[i
].roffs
, 0);
userpc
= *(ADDR
*)(((ADDR
)&u
)+PC
);
if (lastc
== '\0') lastc
= '\n';
return(c
== '\0' ? '\n' : c
);