Annotation of 43BSD/bin/adb/runpcs.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)runpcs.c   4.6 4/25/85";
        !             3: #endif
        !             4: /*
        !             5:  *
        !             6:  *     UNIX debugger
        !             7:  *
        !             8:  */
        !             9: 
        !            10: #include "defs.h"
        !            11: 
        !            12: extern MAP     txtmap;
        !            13: 
        !            14: MSG            NOFORK;
        !            15: MSG            ENDPCS;
        !            16: MSG            BADWAIT;
        !            17: 
        !            18: CHAR           *lp;
        !            19: ADDR           sigint;
        !            20: ADDR           sigqit;
        !            21: 
        !            22: /* breakpoints */
        !            23: BKPTR          bkpthead;
        !            24: 
        !            25: REGLIST                reglist[];
        !            26: 
        !            27: CHAR           lastc;
        !            28: 
        !            29: INT            fcor;
        !            30: INT            fsym;
        !            31: STRING         errflg;
        !            32: INT            errno;
        !            33: INT            signo;
        !            34: INT            sigcode;
        !            35: 
        !            36: L_INT          dot;
        !            37: STRING         symfil;
        !            38: INT            wtflag;
        !            39: L_INT          pid;
        !            40: L_INT          expv;
        !            41: INT            adrflg;
        !            42: L_INT          loopcnt;
        !            43: 
        !            44: 
        !            45: 
        !            46: 
        !            47: 
        !            48: /* service routines for sub process control */
        !            49: 
        !            50: getsig(sig)
        !            51: {      return(expr(0) ? expv : sig);
        !            52: }
        !            53: 
        !            54: ADDR userpc = 1;
        !            55: 
        !            56: runpcs(runmode,execsig)
        !            57: {
        !            58:        INT             rc;
        !            59:        REG BKPTR       bkpt;
        !            60:        IF adrflg THEN userpc=dot; FI
        !            61:        printf("%s: running\n", symfil);
        !            62: 
        !            63:        WHILE --loopcnt>=0
        !            64:        DO
        !            65: #ifdef DEBUG
        !            66:                printf("\ncontinue %x %d\n",userpc,execsig);
        !            67: #endif
        !            68:                IF runmode==SINGLE
        !            69:                THEN delbp(); /* hardware handles single-stepping */
        !            70:                ELSE /* continuing from a breakpoint is hard */
        !            71:                        IF bkpt=scanbkpt(userpc)
        !            72:                        THEN execbkpt(bkpt,execsig); execsig=0;
        !            73:                        FI
        !            74:                        setbp();
        !            75:                FI
        !            76:                ptrace(runmode,pid,userpc,execsig);
        !            77:                bpwait(); chkerr(); execsig=0; delbp(); readregs();
        !            78: 
        !            79:                IF (signo==0) ANDF (bkpt=scanbkpt(userpc))
        !            80:                THEN /* stopped by BPT instruction */
        !            81: #ifdef DEBUG
        !            82:                        printf("\n BPT code; '%s'%o'%o'%d",
        !            83:                                bkpt->comm,bkpt->comm[0],EOR,bkpt->flag);
        !            84: #endif
        !            85:                        dot=bkpt->loc;
        !            86:                        IF bkpt->flag==BKPTEXEC
        !            87:                        ORF ((bkpt->flag=BKPTEXEC)
        !            88:                                ANDF bkpt->comm[0]!=EOR
        !            89:                                ANDF command(bkpt->comm,':')
        !            90:                                ANDF --bkpt->count)
        !            91:                        THEN execbkpt(bkpt,execsig); execsig=0; loopcnt++;
        !            92:                        ELSE bkpt->count=bkpt->initcnt; rc=1;
        !            93:                        FI
        !            94:                ELSE execsig=signo; rc=0;
        !            95:                FI
        !            96:        OD
        !            97:        return(rc);
        !            98: }
        !            99: 
        !           100: #define BPOUT 0
        !           101: #define BPIN 1
        !           102: INT bpstate = BPOUT;
        !           103: 
        !           104: endpcs()
        !           105: {
        !           106:        REG BKPTR       bkptr;
        !           107:        IF pid
        !           108:        THEN ptrace(PT_KILL,pid,0,0); pid=0; userpc=1;
        !           109:             FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           110:             DO IF bkptr->flag
        !           111:                THEN bkptr->flag=BKPTSET;
        !           112:                FI
        !           113:             OD
        !           114:        FI
        !           115:        bpstate=BPOUT;
        !           116: }
        !           117: 
        !           118: #ifdef VFORK
        !           119: nullsig()
        !           120: {
        !           121: 
        !           122: }
        !           123: #endif
        !           124: 
        !           125: setup()
        !           126: {
        !           127:        close(fsym); fsym = -1;
        !           128: #ifndef VFORK
        !           129:        IF (pid = fork()) == 0
        !           130: #else
        !           131:        IF (pid = vfork()) == 0
        !           132: #endif
        !           133:        THEN ptrace(PT_TRACE_ME,0,0,0);
        !           134: #ifdef VFORK
        !           135:             signal(SIGTRAP,nullsig);
        !           136: #endif
        !           137:             signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
        !           138:             doexec(); exit(0);
        !           139:        ELIF pid == -1
        !           140:        THEN error(NOFORK);
        !           141:        ELSE bpwait(); readregs(); lp[0]=EOR; lp[1]=0;
        !           142:             fsym=open(symfil,wtflag);
        !           143:             IF errflg
        !           144:             THEN printf("%s: cannot execute\n",symfil);
        !           145:                  endpcs(); error(0);
        !           146:             FI
        !           147:        FI
        !           148:        bpstate=BPOUT;
        !           149: }
        !           150: 
        !           151: execbkpt(bkptr,execsig)
        !           152: BKPTR  bkptr;
        !           153: {
        !           154: #ifdef DEBUG
        !           155:        printf("exbkpt: %d\n",bkptr->count);
        !           156: #endif
        !           157:        delbp();
        !           158:        ptrace(PT_STEP,pid,bkptr->loc,execsig);
        !           159:        bkptr->flag=BKPTSET;
        !           160:        bpwait(); chkerr(); readregs();
        !           161: }
        !           162: 
        !           163: 
        !           164: doexec()
        !           165: {
        !           166:        STRING          argl[MAXARG];
        !           167:        CHAR            args[LINSIZ];
        !           168:        STRING          p, *ap, filnam;
        !           169:        extern STRING environ;
        !           170:        ap=argl; p=args;
        !           171:        *ap++=symfil;
        !           172:        REP     IF rdc()==EOR THEN break; FI
        !           173:                *ap = p;
        !           174:                /*
        !           175:                 * First thing is to look for direction characters
        !           176:                 * and get filename.  Do not use up the args for filenames.
        !           177:                 * Then get rid of spaces before next args.
        !           178:                 */
        !           179:                IF lastc=='<'
        !           180:                THEN    REP readchar(); PER lastc==SP ORF lastc==TB DONE
        !           181:                        filnam = p;
        !           182:                        WHILE lastc!=EOR ANDF lastc!=SP ANDF lastc!=TB ANDF lastc!='>'
        !           183:                                DO *p++=lastc; readchar(); OD
        !           184:                        *p = 0;
        !           185:                        close(0);
        !           186:                        IF open(filnam,0)<0
        !           187:                        THEN    printf("%s: cannot open\n",filnam); _exit(0);
        !           188:                        FI
        !           189:                        p = *ap;
        !           190:                ELIF lastc=='>'
        !           191:                THEN    REP readchar(); PER lastc==SP ORF lastc==TB DONE
        !           192:                        filnam = p;
        !           193:                        WHILE lastc!=EOR ANDF lastc!=SP ANDF lastc!=TB ANDF lastc!='<'
        !           194:                                DO *p++=lastc; readchar(); OD
        !           195:                        *p = '\0';
        !           196:                        close(1);
        !           197:                        IF creat(filnam,0666)<0
        !           198:                        THEN    printf("%s: cannot create\n",filnam); _exit(0);
        !           199:                        FI
        !           200:                        p = *ap;
        !           201:                ELSE    
        !           202:                        WHILE lastc!=EOR ANDF lastc!=SP ANDF lastc!=TB ANDF lastc!='>' ANDF lastc!='<'
        !           203:                                DO *p++=lastc; readchar(); OD
        !           204:                        *p++ = '\0';
        !           205:                        ap++;
        !           206:                FI
        !           207:        PER lastc!=EOR DONE
        !           208:        *ap++=0;
        !           209:        exect(symfil, argl, environ);
        !           210:        perror(symfil);
        !           211: }
        !           212: 
        !           213: BKPTR  scanbkpt(adr)
        !           214: ADDR adr;
        !           215: {
        !           216:        REG BKPTR       bkptr;
        !           217:        FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           218:        DO IF bkptr->flag ANDF bkptr->loc==adr
        !           219:           THEN break;
        !           220:           FI
        !           221:        OD
        !           222:        return(bkptr);
        !           223: }
        !           224: 
        !           225: delbp()
        !           226: {
        !           227:        REG ADDR        a;
        !           228:        REG BKPTR       bkptr;
        !           229:        IF bpstate!=BPOUT
        !           230:        THEN
        !           231:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           232:                DO      IF bkptr->flag
        !           233:                        THEN a=bkptr->loc;
        !           234:                                IF a < txtmap.e1 THEN
        !           235:                                        ptrace(PT_WRITE_I,pid,a,bkptr->ins);
        !           236:                                ELSE
        !           237:                                        ptrace(PT_WRITE_D,pid,a,bkptr->ins);
        !           238:                                FI
        !           239:                        FI
        !           240:                OD
        !           241:                bpstate=BPOUT;
        !           242:        FI
        !           243: }
        !           244: 
        !           245: #ifdef vax
        !           246: #define        SETBP(ins)      (BPT | ((ins) &~ 0xFF))
        !           247: #endif
        !           248: 
        !           249: setbp()
        !           250: {
        !           251:        REG ADDR                a;
        !           252:        REG BKPTR       bkptr;
        !           253: 
        !           254:        IF bpstate!=BPIN
        !           255:        THEN
        !           256:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           257:                DO IF bkptr->flag
        !           258:                   THEN a = bkptr->loc;
        !           259:                        IF a < txtmap.e1 THEN
        !           260:                                bkptr->ins = ptrace(PT_READ_I, pid, a, 0);
        !           261:                                ptrace(PT_WRITE_I, pid, a, SETBP(bkptr->ins));
        !           262:                        ELSE
        !           263:                                bkptr->ins = ptrace(PT_READ_D, pid, a, 0);
        !           264:                                ptrace(PT_WRITE_D, pid, a, SETBP(bkptr->ins));
        !           265:                        FI
        !           266:                        IF errno
        !           267:                        THEN prints("cannot set breakpoint: ");
        !           268:                             psymoff(bkptr->loc,ISYM,"\n");
        !           269:                        FI
        !           270:                   FI
        !           271:                OD
        !           272:                bpstate=BPIN;
        !           273:        FI
        !           274: }
        !           275: 
        !           276: bpwait()
        !           277: {
        !           278:        REG ADDR w;
        !           279:        ADDR stat;
        !           280: 
        !           281:        signal(SIGINT, 1);
        !           282:        WHILE (w = wait(&stat))!=pid ANDF w != -1 DONE
        !           283:        signal(SIGINT,sigint);
        !           284:        IF w == -1
        !           285:        THEN pid=0;
        !           286:             errflg=BADWAIT;
        !           287:        ELIF (stat & 0177) != 0177
        !           288:        THEN sigcode = 0;
        !           289:             IF signo = stat&0177
        !           290:             THEN sigprint();
        !           291:             FI
        !           292:             IF stat&0200
        !           293:             THEN prints(" - core dumped");
        !           294:                  close(fcor);
        !           295:                  setcor();
        !           296:             FI
        !           297:             pid=0;
        !           298:             errflg=ENDPCS;
        !           299:        ELSE signo = stat>>8;
        !           300:             sigcode = ptrace(PT_READ_U, pid, &((struct user *)0)->u_code, 0);
        !           301:             IF signo!=SIGTRAP
        !           302:             THEN sigprint();
        !           303:             ELSE signo=0;
        !           304:             FI
        !           305:             flushbuf();
        !           306:        FI
        !           307: }
        !           308: 
        !           309: readregs()
        !           310: {
        !           311:        /*get REG values from pcs*/
        !           312:        REG i;
        !           313:        FOR i=24; --i>=0; 
        !           314:        DO *(ADDR *)(((ADDR)&u)+reglist[i].roffs) =
        !           315:                    ptrace(PT_READ_U, pid, reglist[i].roffs, 0);
        !           316:        OD
        !           317:        userpc= *(ADDR *)(((ADDR)&u)+PC);
        !           318: }
        !           319: 
        !           320: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.