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

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

unix.superglobalmegacorp.com

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