Annotation of 3BSD/cmd/sdb/runpcs.c, revision 1.1.1.1

1.1       root        1: #
                      2: /*
                      3:  *
                      4:  *     UNIX debugger
                      5:  *
                      6:  */
                      7: 
                      8: #include "head.h"
                      9: #include <a.out.h>
                     10: struct user u;
                     11: #include <stdio.h>
                     12: 
                     13: 
                     14: MSG            NOFORK;
                     15: MSG            ENDPCS;
                     16: MSG            BADWAIT;
                     17: 
                     18: ADDR           sigint;
                     19: ADDR           sigqit;
                     20: 
                     21: /* breakpoints */
                     22: BKPTR          bkpthead;
                     23: 
                     24: 
                     25: REGLIST reglist [] = {
                     26:                "p1lr", P1LR,
                     27:                "p1br",P1BR,
                     28:                "p0lr", P0LR,
                     29:                "p0br",P0BR,
                     30:                "ksp",KSP,
                     31:                "esp",ESP,
                     32:                "ssp",SSP,
                     33:                "psl", PSL,
                     34:                "pc", PC,
                     35:                "usp",USP,
                     36:                "fp", FP,
                     37:                "ap", AP,
                     38:                "r11", R11,
                     39:                "r10", R10,
                     40:                "r9", R9,
                     41:                "r8", R8,
                     42:                "r7", R7,
                     43:                "r6", R6,
                     44:                "r5", R5,
                     45:                "r4", R4,
                     46:                "r3", R3,
                     47:                "r2", R2,
                     48:                "r1", R1,
                     49:                "r0", R0,
                     50: };
                     51: 
                     52: 
                     53: CHAR           lastc;
                     54: 
                     55: INT            fcor;
                     56: INT            fsym;
                     57: STRING         errflg;
                     58: int            errno;
                     59: INT            signo;
                     60: 
                     61: L_INT          dot;
                     62: STRING         symfil;
                     63: INT            wtflag;
                     64: INT            pid;
                     65: INT            adrflg;
                     66: L_INT          loopcnt;
                     67: 
                     68: 
                     69: 
                     70: 
                     71: 
                     72: 
                     73: getsig(sig)
                     74: {      return(sig);
                     75: }
                     76: 
                     77: ADDR userpc = 1;
                     78: 
                     79: runpcs(runmode,execsig)
                     80: {
                     81:        REG BKPTR       bkpt;
                     82:        IF adrflg THEN userpc=dot; FI
                     83:        WHILE --loopcnt>=0
                     84:        DO
                     85:                if (debug) printf("\ncontinue %x %d\n",userpc,execsig);
                     86:                IF runmode==SINGLE
                     87:                THEN delbp(); /* hardware handles single-stepping */
                     88:                ELSE /* continuing from a breakpoint is hard */
                     89:                        IF bkpt=scanbkpt(userpc)
                     90:                        THEN execbkpt(bkpt,execsig); execsig=0;
                     91:                        FI
                     92:                        setbp();
                     93:                FI
                     94:                ptrace(runmode,pid,userpc,execsig);
                     95:                bpwait(); chkerr(); execsig=0; delbp(); readregs();
                     96: 
                     97:        loop1:  IF (signo==0) ANDF (bkpt=scanbkpt(userpc))
                     98:                THEN /* stopped by BPT instruction */
                     99:                        if (debug) printf("\n BPT code; '%s'%o'%o'%d",
                    100:                                bkpt->comm,bkpt->comm[0],EOR,bkpt->flag);
                    101:                        dot=bkpt->loc;
                    102:                        IF bkpt->comm[0] != EOR
                    103:                        THEN acommand(bkpt->comm);
                    104:                        FI
                    105:                        IF bkpt->flag==BKPTEXEC
                    106:                        ORF ((bkpt->flag=BKPTEXEC)
                    107:                                ANDF bkpt->comm[0]!=EOR)
                    108:                        THEN execbkpt(bkpt,execsig); execsig=0; loopcnt++;
                    109:                             goto loop1;
                    110:                        ELSE bkpt->count=bkpt->initcnt;
                    111:                        FI
                    112:                ELSE execsig=signo;
                    113:                     if (execsig) break;
                    114:                FI
                    115:        OD
                    116:                if (debug) printf("Returning from runpcs\n");
                    117: }
                    118: 
                    119: #define BPOUT 0
                    120: #define BPIN 1
                    121: INT bpstate = BPOUT;
                    122: 
                    123: endpcs()
                    124: {
                    125:        REG BKPTR       bkptr;
                    126:                if (debug) printf("Entering endpcs with pid=%d\n");
                    127:        IF pid
                    128:        THEN ptrace(EXIT,pid,0,0); pid=0; userpc=1;
                    129:             FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
                    130:             DO IF bkptr->flag
                    131:                THEN bkptr->flag=BKPTSET;
                    132:                FI
                    133:             OD
                    134:        FI
                    135:        bpstate=BPOUT;
                    136: }
                    137: 
                    138: #ifdef VFORK
                    139: nullsig()
                    140: {
                    141: 
                    142: }
                    143: #endif
                    144: 
                    145: setup()
                    146: {
                    147:        close(fsym); fsym = -1;
                    148: #ifdef VFORK
                    149:        IF (pid = vfork()) == 0
                    150: #else
                    151:        IF (pid = fork()) == 0
                    152: #endif
                    153:        THEN ptrace(SETTRC,0,0,0);
                    154:             signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
                    155: #ifdef VFORK
                    156:             signal(SIGTRC,nullsig);
                    157: #endif
                    158:                if (debug) printf("About to doexec  pid=%d\n",pid);
                    159: #ifdef UCBVAX
                    160:             doexec(); _exit(0);
                    161: #else
                    162:             doexec(); exit(0);
                    163: #endif
                    164:        ELIF pid == -1
                    165:        THEN error(NOFORK);
                    166:        ELSE bpwait(); readregs();
                    167:        if (debug) printf("About to open symfil = %s\n", symfil);
                    168:             fsym=open(symfil,wtflag);
                    169:             IF errflg
                    170:             THEN printf("%s: cannot execute\n",symfil);
                    171:                if (debug) printf("%d %s\n", errflg, errflg);
                    172:                  endpcs();
                    173:             FI
                    174:        FI
                    175:        bpstate=BPOUT;
                    176: }
                    177: 
                    178: execbkpt(bkptr,execsig)
                    179: BKPTR  bkptr;
                    180: {
                    181:        if (debug) printf("exbkpt: %d\n",bkptr->count);
                    182:        delbp();
                    183:        ptrace(SINGLE,pid,bkptr->loc,execsig);
                    184:        bkptr->flag=BKPTSET;
                    185:        bpwait(); chkerr(); readregs();
                    186: }
                    187: 
                    188: extern STRING environ;
                    189: 
                    190: doexec()
                    191: {
                    192:        char *argl[MAXARG], args[LINSIZ];
                    193:        register char c, redchar, *argsp, **arglp, *filnam;
                    194: 
                    195:        arglp = argl;
                    196:        argsp = args;
                    197:        *arglp++ = symfil;
                    198:        c = ' ';
                    199: 
                    200:        do {
                    201:                while (eqany(c, " \t")) {
                    202:                        c = rdc();
                    203:                } 
                    204:                if (eqany(c, "<>")) {
                    205:                        redchar = c;
                    206:                        do {
                    207:                                c = rdc();
                    208:                        } while (eqany(c, " \t"));
                    209:                        filnam = argsp;
                    210:                        do {
                    211:                                *argsp++ = c;
                    212:                                c = rdc();
                    213:                        } while (!eqany(c, " <>\t\n"));
                    214:                        *argsp++ = '\0';
                    215:                        if (redchar == '<') {
                    216:                                close(0);
                    217:                                if (open(filnam,0) < 0) {
                    218:                                        printf("%s: cannot open\n",filnam);
                    219: #ifdef UCBVAX
                    220:                                         _exit(0);
                    221: #else
                    222:                                         exit(0);
                    223: #endif
                    224:                                }
                    225:                        } else {
                    226:                                close(1);
                    227:                                if (creat(filnam,0666) < 0) {
                    228:                                        printf("%s: cannot create\n",filnam);
                    229: #ifdef UCBVAX
                    230:                                         _exit(0);
                    231: #else
                    232:                                         exit(0);
                    233: #endif
                    234:                                }
                    235:                        }
                    236:                } else if (c != '\n') {
                    237:                        *arglp++ = argsp;
                    238:                        do {
                    239:                                *argsp++ = c;
                    240:                                c = rdc();
                    241:                        } while(!eqany(c, " <>\t\n"));
                    242:                        *argsp++ = '\0';
                    243:                }
                    244:        } while (c != '\n');
                    245:        *arglp = (char *) 0;
                    246:        if (debug) {
                    247:                char **dap;
                    248:                printf("About to exect(%s, %d, %d)\n",symfil,argl,environ);
                    249:                for (dap = argl; *dap; dap++) {
                    250:                        printf("%s, ", *dap);
                    251:                }
                    252:        }
                    253:        exect(symfil, argl, environ);
                    254:        perror("Returned from exect");
                    255: }
                    256: 
                    257: BKPTR  scanbkpt(adr)
                    258: ADDR adr;
                    259: {
                    260:        REG BKPTR       bkptr;
                    261:        FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
                    262:        DO IF bkptr->flag ANDF bkptr->loc==adr
                    263:           THEN break;
                    264:           FI
                    265:        OD
                    266:        return(bkptr);
                    267: }
                    268: 
                    269: delbp()
                    270: {
                    271:        REG ADDR        a;
                    272:        REG BKPTR       bkptr;
                    273:        IF bpstate!=BPOUT
                    274:        THEN
                    275:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
                    276:                DO      IF bkptr->flag
                    277:                        THEN a=bkptr->loc;
                    278:                                ptrace(WIUSER,pid,a,
                    279:                                        (bkptr->ins&0xFF)|(ptrace(RIUSER,pid,a,0)&~0xFF));
                    280:                        FI
                    281:                OD
                    282:                bpstate=BPOUT;
                    283:        FI
                    284: }
                    285: 
                    286: setbp()
                    287: {
                    288:        REG ADDR                a;
                    289:        REG BKPTR       bkptr;
                    290: 
                    291:        IF bpstate!=BPIN
                    292:        THEN
                    293:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
                    294:                DO IF bkptr->flag
                    295:                   THEN a = bkptr->loc;
                    296:                        bkptr->ins = ptrace(RIUSER, pid, a, 0);
                    297:                        ptrace(WIUSER, pid, a, BPT | (bkptr->ins&~0xFF));
                    298:                        IF errno
                    299:                        THEN error("cannot set breakpoint: ");
                    300:                             printf("%s:%d @ %d\n", adrtoprocp(dot)->pname,
                    301:                                adrtolineno(dot), dot);
                    302:                        FI
                    303:                   FI
                    304:                OD
                    305:                bpstate=BPIN;
                    306:        FI
                    307: }
                    308: 
                    309: bpwait()
                    310: {
                    311:        REG ADDR w;
                    312:        ADDR stat;
                    313: 
                    314:        signal(SIGINT, 1);
                    315:        if (debug) printf("Waiting for pid %d\n",pid);
                    316:        WHILE (w = wait(&stat))!=pid ANDF w != -1 DONE
                    317:        if (debug) printf("Ending wait\n");
                    318:        if (debug) printf("w = %d; pid = %d; stat = %o;\n", w,pid,stat);
                    319:        signal(SIGINT,sigint);
                    320:        IF w == -1
                    321:        THEN pid=0;
                    322:             errflg=BADWAIT;
                    323:        ELIF (stat & 0177) != 0177
                    324:        THEN IF signo = stat&0177
                    325:             THEN sigprint();
                    326:             FI
                    327:             IF stat&0200
                    328:             THEN error(" - core dumped");
                    329:                  close(fcor);
                    330:                  setcor();
                    331:             FI
                    332:             pid=0;
                    333:             errflg=ENDPCS;
                    334:        ELSE signo = stat>>8;
                    335:             if (debug) printf("PC = %d, dbsubn = %d\n",
                    336:                ptrace(RUREGS, pid, PC, 0), extaddr("_dbsubn")); 
                    337:             IF signo!=SIGTRC ANDF
                    338:                ptrace(RUREGS, pid, PC, 0) != extaddr("_dbsubn")
                    339:             THEN sigprint();
                    340:             ELSE signo=0;
                    341:             FI
                    342:        FI
                    343: }
                    344: 
                    345: readregs()
                    346: {
                    347:        /*get REG values from pcs*/
                    348:        REG i;
                    349:        FOR i=24; --i>=0; 
                    350:        DO *(ADDR *)(((ADDR)&u)+reglist[i].roffs) =
                    351:                    ptrace(RUREGS, pid, reglist[i].roffs, 0);
                    352:        OD
                    353:        userpc= *(ADDR *)(((ADDR)&u)+PC);
                    354: }
                    355: 
                    356: char 
                    357: readchar() {
                    358:        lastc = *argsp++;
                    359:        if (lastc == '\0') lastc = '\n';
                    360:        return(lastc);
                    361: }
                    362: 
                    363: char
                    364: rdc()
                    365: {
                    366:        register char c;
                    367: 
                    368:        c = *argsp++;
                    369:        return(c == '\0' ? '\n' : c);
                    370: }

unix.superglobalmegacorp.com

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