Bell 32V release
[unix-history] / usr / src / cmd / adb / runpcs.c
index 821554f..2219879 100644 (file)
@@ -6,6 +6,8 @@
  */
 
 #include "defs.h"
  */
 
 #include "defs.h"
+SCCSID(@(#)runpcs.c    2.7);
+struct user u;
 
 
 MSG            NOFORK;
 
 
 MSG            NOFORK;
@@ -13,8 +15,8 @@ MSG           ENDPCS;
 MSG            BADWAIT;
 
 CHAR           *lp;
 MSG            BADWAIT;
 
 CHAR           *lp;
-INT            sigint;
-INT            sigqit;
+ADDR           sigint;
+ADDR           sigqit;
 
 /* breakpoints */
 BKPTR          bkpthead;
 
 /* breakpoints */
 BKPTR          bkpthead;
@@ -22,8 +24,6 @@ BKPTR         bkpthead;
 REGLIST                reglist[];
 
 CHAR           lastc;
 REGLIST                reglist[];
 
 CHAR           lastc;
-POS            corhdr[];
-POS            *endhdr;
 
 INT            fcor;
 INT            fsym;
 
 INT            fcor;
 INT            fsym;
@@ -34,7 +34,7 @@ INT           signo;
 L_INT          dot;
 STRING         symfil;
 INT            wtflag;
 L_INT          dot;
 STRING         symfil;
 INT            wtflag;
-INT            pid;
+L_INT          pid;
 L_INT          expv;
 INT            adrflg;
 L_INT          loopcnt;
 L_INT          expv;
 INT            adrflg;
 L_INT          loopcnt;
@@ -46,47 +46,59 @@ L_INT               loopcnt;
 /* service routines for sub process control */
 
 getsig(sig)
 /* 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;
 {
        INT             rc;
        REG BKPTR       bkpt;
-       IF adrflg
-       THEN userpc=shorten(dot);
-       FI
-       setbp();
+       IF adrflg THEN userpc=dot; FI
        printf("%s: running\n", symfil);
 
        printf("%s: running\n", symfil);
 
-       WHILE (loopcnt--)>0
+       WHILE --loopcnt>=0
        DO
 #ifdef DEBUG
        DO
 #ifdef DEBUG
-               printf("\ncontinue %d %d\n",userpc,execsig);
+               printf("\ncontinue %x %d\n",userpc,execsig);
 #endif
 #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);
                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);
 }
 
                FI
        OD
        return(rc);
 }
 
+#define BPOUT 0
+#define BPIN 1
+INT bpstate = BPOUT;
+
 endpcs()
 {
        REG BKPTR       bkptr;
 endpcs()
 {
        REG BKPTR       bkptr;
@@ -98,6 +110,7 @@ endpcs()
                FI
             OD
        FI
                FI
             OD
        FI
+       bpstate=BPOUT;
 }
 
 setup()
 }
 
 setup()
@@ -116,21 +129,19 @@ setup()
                  endpcs(); error(0);
             FI
        FI
                  endpcs(); error(0);
             FI
        FI
+       bpstate=BPOUT;
 }
 
 }
 
-execbkpt(bkptr)
+execbkpt(bkptr,execsig)
 BKPTR  bkptr;
 BKPTR  bkptr;
-{      INT             bkptloc;
+{
 #ifdef DEBUG
        printf("exbkpt: %d\n",bkptr->count);
 #endif
 #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;
        bkptr->flag=BKPTSET;
+       bpwait(); chkerr(); readregs();
 }
 
 
 }
 
 
@@ -139,6 +150,7 @@ doexec()
        STRING          argl[MAXARG];
        CHAR            args[LINSIZ];
        STRING          p, *ap, filnam;
        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
        ap=argl; p=args;
        *ap++=symfil;
        REP     IF rdc()==EOR THEN break; FI
@@ -159,10 +171,11 @@ doexec()
                FI
        PER lastc!=EOR DONE
        *ap++=0;
                FI
        PER lastc!=EOR DONE
        *ap++=0;
-       execv(symfil, argl);
+       exect(symfil, argl, environ);
 }
 
 BKPTR  scanbkpt(adr)
 }
 
 BKPTR  scanbkpt(adr)
+ADDR adr;
 {
        REG BKPTR       bkptr;
        FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
 {
        REG BKPTR       bkptr;
        FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
@@ -175,44 +188,51 @@ BKPTR     scanbkpt(adr)
 
 delbp()
 {
 
 delbp()
 {
-       REG INT         a;
+       REG ADDR        a;
        REG BKPTR       bkptr;
        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()
 {
 }
 
 setbp()
 {
-       REG INT         a;
+       REG ADDR                a;
        REG BKPTR       bkptr;
 
        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()
 {
 }
 
 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);
 
        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;
        IF w == -1
        THEN pid=0;
             errflg=BADWAIT;
@@ -240,14 +260,11 @@ readregs()
 {
        /*get REG values from pcs*/
        REG i;
 {
        /*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
        OD
-
-       /* REALing poINT                */
-       FOR i=FROFF; i<FRLEN+FROFF; i++
-       DO corhdr[i] = ptrace(RUREGS,pid,i,0); OD
+       userpc= *(ADDR *)(((ADDR)&u)+PC);
 }
 
 
 }