*/
#include "defs.h"
+SCCSID(@(#)runpcs.c 2.7);
+struct user u;
MSG NOFORK;
MSG BADWAIT;
CHAR *lp;
-INT sigint;
-INT sigqit;
+ADDR sigint;
+ADDR sigqit;
/* breakpoints */
BKPTR bkpthead;
REGLIST reglist[];
CHAR lastc;
-POS corhdr[];
-POS *endhdr;
INT fcor;
INT fsym;
L_INT dot;
STRING symfil;
INT wtflag;
-INT pid;
+L_INT pid;
L_INT expv;
INT adrflg;
L_INT loopcnt;
/* service routines for sub process control */
getsig(sig)
-{ return(expr(0) ? shorten(expv) : sig);
+{ return(expr(0) ? expv : sig);
}
-INT userpc=1;
+ADDR userpc = 1;
-runpcs(runmode, execsig)
+runpcs(runmode,execsig)
{
INT rc;
REG BKPTR bkpt;
- IF adrflg
- THEN userpc=shorten(dot);
- FI
- setbp();
+ IF adrflg THEN userpc=dot; FI
printf("%s: running\n", symfil);
- WHILE (loopcnt--)>0
+ WHILE --loopcnt>=0
DO
#ifdef DEBUG
- printf("\ncontinue %d %d\n",userpc,execsig);
+ printf("\ncontinue %x %d\n",userpc,execsig);
#endif
- stty(0,&usrtty);
+ IF runmode==SINGLE
+ THEN delbp(); /* hardware handles single-stepping */
+ ELSE /* continuing from a breakpoint is hard */
+ IF bkpt=scanbkpt(userpc)
+ THEN execbkpt(bkpt,execsig); execsig=0;
+ FI
+ setbp();
+ FI
ptrace(runmode,pid,userpc,execsig);
- bpwait(); chkerr(); readregs();
-
- /*look for bkpt*/
- IF signo==0 ANDF (bkpt=scanbkpt(endhdr[pc]-2))
- THEN /*stopped at bkpt*/
- userpc=endhdr[pc]=bkpt->loc;
- IF bkpt->flag==BKPTEXEC
- ORF ((bkpt->flag=BKPTEXEC, command(bkpt->comm,':')) ANDF --bkpt->count)
- THEN execbkpt(bkpt); execsig=0; loopcnt++;
- userpc=1;
- ELSE bkpt->count=bkpt->initcnt;
- rc=1;
- FI
- ELSE rc=0; execsig=signo; userpc=1;
+ bpwait(); chkerr(); execsig=0; delbp(); readregs();
+
+ IF (signo==0) ANDF (bkpt=scanbkpt(userpc))
+ THEN /* stopped by BPT instruction */
+#ifdef DEBUG
+ printf("\n BPT code; '%s'%o'%o'%d",
+ bkpt->comm,bkpt->comm[0],EOR,bkpt->flag);
+#endif
+ dot=bkpt->loc;
+ IF bkpt->flag==BKPTEXEC
+ ORF ((bkpt->flag=BKPTEXEC)
+ ANDF bkpt->comm[0]!=EOR
+ ANDF command(bkpt->comm,':')
+ ANDF --bkpt->count)
+ THEN execbkpt(bkpt,execsig); execsig=0; loopcnt++;
+ ELSE bkpt->count=bkpt->initcnt; rc=1;
+ FI
+ ELSE execsig=signo; rc=0;
FI
OD
return(rc);
}
+#define BPOUT 0
+#define BPIN 1
+INT bpstate = BPOUT;
+
endpcs()
{
REG BKPTR bkptr;
FI
OD
FI
+ bpstate=BPOUT;
}
setup()
endpcs(); error(0);
FI
FI
+ bpstate=BPOUT;
}
-execbkpt(bkptr)
+execbkpt(bkptr,execsig)
BKPTR bkptr;
-{ INT bkptloc;
+{
#ifdef DEBUG
printf("exbkpt: %d\n",bkptr->count);
#endif
- bkptloc = bkptr->loc;
- ptrace(WIUSER,pid,bkptloc,bkptr->ins);
- stty(0,&usrtty);
- ptrace(SINGLE,pid,bkptloc,0);
- bpwait(); chkerr();
- ptrace(WIUSER,pid,bkptloc,BPT);
+ delbp();
+ ptrace(SINGLE,pid,bkptr->loc,execsig);
bkptr->flag=BKPTSET;
+ bpwait(); chkerr(); readregs();
}
STRING argl[MAXARG];
CHAR args[LINSIZ];
STRING p, *ap, filnam;
+ extern STRING environ;
ap=argl; p=args;
*ap++=symfil;
REP IF rdc()==EOR THEN break; FI
FI
PER lastc!=EOR DONE
*ap++=0;
- execv(symfil, argl);
+ exect(symfil, argl, environ);
}
BKPTR scanbkpt(adr)
+ADDR adr;
{
REG BKPTR bkptr;
FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
delbp()
{
- REG INT a;
+ REG ADDR a;
REG BKPTR bkptr;
- FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
- DO IF bkptr->flag
- THEN a=bkptr->loc;
- ptrace(WIUSER,pid,a,bkptr->ins);
- FI
- OD
+ IF bpstate!=BPOUT
+ THEN
+ FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
+ DO IF bkptr->flag
+ THEN a=bkptr->loc;
+ ptrace(WIUSER,pid,a,
+ (bkptr->ins&0xFF)|(ptrace(RIUSER,pid,a,0)&~0xFF));
+ FI
+ OD
+ bpstate=BPOUT;
+ FI
}
setbp()
{
- REG INT a;
+ REG ADDR a;
REG BKPTR bkptr;
- FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
- DO IF bkptr->flag
- THEN a = bkptr->loc;
- bkptr->ins = ptrace(RIUSER, pid, a, 0);
- ptrace(WIUSER, pid, a, BPT);
- IF errno
- THEN prints("cannot set breakpoint: ");
- psymoff(leng(bkptr->loc),ISYM,"\n");
- FI
- FI
- OD
+ IF bpstate!=BPIN
+ THEN
+ FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
+ DO IF bkptr->flag
+ THEN a = bkptr->loc;
+ bkptr->ins = ptrace(RIUSER, pid, a, 0);
+ ptrace(WIUSER, pid, a, BPT | (bkptr->ins&~0xFF));
+ IF errno
+ THEN prints("cannot set breakpoint: ");
+ psymoff(bkptr->loc,ISYM,"\n");
+ FI
+ FI
+ OD
+ bpstate=BPIN;
+ FI
}
bpwait()
{
- REG INT w;
- INT stat;
+ REG ADDR w;
+ ADDR stat;
signal(SIGINT, 1);
WHILE (w = wait(&stat))!=pid ANDF w != -1 DONE
signal(SIGINT,sigint);
- gtty(0,&usrtty);
- stty(0,&adbtty);
IF w == -1
THEN pid=0;
errflg=BADWAIT;
{
/*get REG values from pcs*/
REG i;
- FOR i=0; i<9; i++
- DO endhdr[reglist[i].roffs] =
- ptrace(RUREGS, pid, 2*(512+reglist[i].roffs), 0);
+ FOR i=24; --i>=0;
+ DO *(ADDR *)(((ADDR)&u)+reglist[i].roffs) =
+ ptrace(RUREGS, pid, reglist[i].roffs, 0);
OD
-
- /* REALing poINT */
- FOR i=FROFF; i<FRLEN+FROFF; i++
- DO corhdr[i] = ptrace(RUREGS,pid,i,0); OD
+ userpc= *(ADDR *)(((ADDR)&u)+PC);
}