Annotation of cci/usr/src/bin/adb/runpcs.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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