Annotation of researchv10no/cmd/sdb/runpcs.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)runpcs.c 4.1 10/9/80";
        !             2: #
        !             3: /*
        !             4:  *
        !             5:  *     UNIX debugger
        !             6:  *     process control routines for sdb
        !             7:  *     this is a hack on top of a hack on top of a hack
        !             8:  *
        !             9:  */
        !            10: 
        !            11: #include "head.h"
        !            12: #include <a.out.h>
        !            13: #include <stab.h>
        !            14: struct user u;
        !            15: #include <stdio.h>
        !            16: #include <sys/pioctl.h>
        !            17: #include <sys/proc.h>
        !            18: #include "base.h"
        !            19: 
        !            20: #ifndef SIGTRAP
        !            21: #define        SIGTRAP SIGTRC
        !            22: #endif
        !            23: 
        !            24: MSG            NOFORK;
        !            25: MSG            ENDPCS;
        !            26: MSG            BADWAIT;
        !            27: 
        !            28: ADDR           sigint;
        !            29: ADDR           sigqit;
        !            30: ADDR           userpc;
        !            31: 
        !            32: /* breakpoints */
        !            33: BKPTR          bkpthead;
        !            34: 
        !            35: CHAR           lastc;
        !            36: 
        !            37: INT            fcor;
        !            38: INT            fsym;
        !            39: STRING         errflg;
        !            40: int            errno;
        !            41: INT            signo;
        !            42: 
        !            43: L_INT          dot;
        !            44: STRING         symfil;
        !            45: INT            wtflag;
        !            46: INT            pid;
        !            47: INT            adrflg;
        !            48: L_INT          loopcnt;
        !            49: 
        !            50: 
        !            51: 
        !            52: 
        !            53: 
        !            54: 
        !            55: getsig(sig)
        !            56: {      return(sig);
        !            57: }
        !            58: 
        !            59: runpcs(runmode,execsig)
        !            60: {
        !            61:        REG BKPTR       bkpt;
        !            62:        IF adrflg THEN userpc=dot; FI
        !            63:        WHILE --loopcnt>=0
        !            64:        DO
        !            65:                if (debug) printf("\ncontinue %x %d\n",userpc,execsig);
        !            66:                IF runmode==SINGLE
        !            67:                THEN delbp(); /* hardware handles single-stepping */
        !            68:                ELSE /* continuing from a breakpoint is hard */
        !            69:                        IF bkpt=scanbkpt(userpc)
        !            70:                        THEN execbkpt(bkpt,execsig); execsig=0;
        !            71:                        FI
        !            72:                        setbp();
        !            73:                FI
        !            74:                setrun(runmode,userpc,execsig);
        !            75:                bpwait(); chkerr(); execsig=0; delbp(); readregs();
        !            76: 
        !            77:        loop1:  IF (signo==0) ANDF (bkpt=scanbkpt(userpc))
        !            78:                THEN /* stopped by BPT instruction */
        !            79:                        if (debug) printf("\n BPT code; '%s'%o'%o'%d",
        !            80:                                bkpt->comm,bkpt->comm[0],EOR,bkpt->flag);
        !            81:                        dot=bkpt->loc;
        !            82:                        IF bkpt->comm[0] != EOR
        !            83:                        THEN acommand(bkpt->comm);
        !            84:                        FI
        !            85:                        IF bkpt->flag==BKPTEXEC
        !            86:                        ORF ((bkpt->flag=BKPTEXEC)
        !            87:                                ANDF bkpt->comm[0]!=EOR)
        !            88:                        THEN execbkpt(bkpt,execsig); execsig=0; loopcnt++;
        !            89:                             goto loop1;
        !            90:                        ELSE bkpt->flag=BKPTSET; bkpt->count=bkpt->initcnt;
        !            91:                        FI
        !            92:                ELSE execsig=signo;
        !            93:                     if (execsig) break;
        !            94:                FI
        !            95:        OD
        !            96:                if (debug) printf("Returning from runpcs\n");
        !            97: }
        !            98: 
        !            99: #define BPOUT 0
        !           100: #define BPIN 1
        !           101: INT bpstate;
        !           102: 
        !           103: endpcs()
        !           104: {
        !           105:        REG BKPTR       bkptr;
        !           106:                if (debug) printf("Entering endpcs with pid=%d\n");
        !           107:        IF pid
        !           108:        THEN killpcs(); 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: setup()
        !           119: {
        !           120:        int fd;
        !           121:        long tsigs = ~0;
        !           122: 
        !           123:        fd = openproc(getpid());
        !           124:        if (ioctl(fd, PIOCSEXEC, 0) < 0) {
        !           125:                close(fd);
        !           126:                error("no process ioctl");
        !           127:        }
        !           128:        close(fsym);
        !           129:        fsym = -1;
        !           130:        IF (pid = fork()) == 0
        !           131:        THEN close(fd);
        !           132:             signal(SIGINT,sigint); signal(SIGQUIT,sigqit);
        !           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 ioctl(fd, PIOCREXEC, 0);
        !           138:             close(fd);
        !           139:             datmap.ufd = fcor = openproc(pid);
        !           140:             ioctl(fcor, PIOCSMASK, &tsigs);
        !           141:             bpwait();
        !           142:             readregs();
        !           143:        if (debug) printf("About to open symfil = %s\n", symfil);
        !           144:             fsym=open(symfil,wtflag);
        !           145:             IF errflg
        !           146:             THEN printf("%s: cannot execute\n",symfil);
        !           147:                if (debug) printf("%d %s\n", errflg, errflg);
        !           148:                  endpcs();
        !           149:             FI
        !           150:        FI
        !           151:        bpstate=BPOUT;
        !           152: }
        !           153: 
        !           154: execbkpt(bkptr,execsig)
        !           155: BKPTR  bkptr;
        !           156: {
        !           157:        if (debug) printf("exbkpt: %d\n",bkptr->count);
        !           158:        delbp();
        !           159:        setrun(SINGLE,bkptr->loc,execsig);
        !           160:        bkptr->flag=BKPTSET;
        !           161:        bpwait(); chkerr(); readregs();
        !           162: }
        !           163: 
        !           164: doexec()
        !           165: {
        !           166:        char *argl[MAXARG], args[LINSIZ];
        !           167:        register char c, redchar, *argsp, **arglp, *filnam;
        !           168: 
        !           169:        arglp = argl;
        !           170:        argsp = args;
        !           171:        *arglp++ = symfil;
        !           172:        c = ' ';
        !           173: 
        !           174:        do {
        !           175:                while (eqany(c, " \t")) {
        !           176:                        c = rdc();
        !           177:                } 
        !           178:                if (eqany(c, "<>")) {
        !           179:                        redchar = c;
        !           180:                        do {
        !           181:                                c = rdc();
        !           182:                        } while (eqany(c, " \t"));
        !           183:                        filnam = argsp;
        !           184:                        do {
        !           185:                                *argsp++ = c;
        !           186:                                c = rdc();
        !           187:                        } while (!eqany(c, " <>\t\n"));
        !           188:                        *argsp++ = '\0';
        !           189:                        if (redchar == '<') {
        !           190:                                close(0);
        !           191:                                if (open(filnam,0) < 0) {
        !           192:                                        printf("%s: cannot open\n",filnam);
        !           193:                                        fflush(stdout);
        !           194:                                        _exit(0);
        !           195:                                }
        !           196:                        } else {
        !           197:                                close(1);
        !           198:                                if (creat(filnam,0666) < 0) {
        !           199:                                        printf("%s: cannot create\n",filnam);
        !           200:                                        fflush(stdout);
        !           201:                                         _exit(0);
        !           202:                                }
        !           203:                        }
        !           204:                } else if (c != '\n') {
        !           205:                        *arglp++ = argsp;
        !           206:                        do {
        !           207:                                *argsp++ = c;
        !           208:                                c = rdc();
        !           209:                        } while(!eqany(c, " <>\t\n"));
        !           210:                        *argsp++ = '\0';
        !           211:                }
        !           212:        } while (c != '\n');
        !           213:        *arglp = (char *) 0;
        !           214:        if (debug) {
        !           215:                char **dap;
        !           216:                printf("About to execv(%s, %d)\n",symfil,argl);
        !           217:                for (dap = argl; *dap; dap++) {
        !           218:                        printf("%s, ", *dap);
        !           219:                }
        !           220:        }
        !           221:        execv(symfil, argl);
        !           222:        perror("Returned from exect");
        !           223: }
        !           224: 
        !           225: BKPTR  scanbkpt(adr)
        !           226: ADDR adr;
        !           227: {
        !           228:        REG BKPTR       bkptr;
        !           229:        FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           230:        DO IF bkptr->flag ANDF bkptr->loc==adr
        !           231:           THEN break;
        !           232:           FI
        !           233:        OD
        !           234:        return(bkptr);
        !           235: }
        !           236: 
        !           237: delbp()
        !           238: {
        !           239:        REG ADDR        a;
        !           240:        REG BKPTR       bkptr;
        !           241:        IF bpstate!=BPOUT
        !           242:        THEN
        !           243:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           244:                DO      IF bkptr->flag
        !           245:                        THEN a=bkptr->loc;
        !           246:                                prwrite(a, &bkptr->ins, 1);
        !           247:                        FI
        !           248:                OD
        !           249:                bpstate=BPOUT;
        !           250:        FI
        !           251: }
        !           252: 
        !           253: setbp()
        !           254: {
        !           255:        REG ADDR                a;
        !           256:        REG BKPTR       bkptr;
        !           257:        char bpt = BPT;
        !           258: 
        !           259:        IF bpstate!=BPIN
        !           260:        THEN
        !           261:                FOR bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt
        !           262:                DO IF bkptr->flag
        !           263:                   THEN a = bkptr->loc;
        !           264:                        prread(a, &bkptr->ins, 1);
        !           265:                        prwrite(a, &bpt, 1);
        !           266:                        IF errflg
        !           267:                        THEN error("cannot set breakpoint: ");
        !           268:                             printf("%s:%d @ %d\n", adrtoprocp(dot)->pname,
        !           269:                                adrtolineno(dot), dot);
        !           270:                             errflg = 0;
        !           271:                        FI
        !           272:                   FI
        !           273:                OD
        !           274:                bpstate=BPIN;
        !           275:        FI
        !           276: }
        !           277: 
        !           278: #define        WSLEEP  10
        !           279: 
        !           280: bpwait()
        !           281: {
        !           282:        register int w;
        !           283:        struct proc p;
        !           284:        int pc;
        !           285:        int stat;
        !           286:        int (*isig)();
        !           287:        int nulsig();
        !           288:        extern int errno;
        !           289: 
        !           290:        isig = signal(SIGINT, SIG_IGN);
        !           291:        /*
        !           292:         * alarm stuff is just in case
        !           293:         */
        !           294:        for (;;) {
        !           295:                signal(SIGALRM, nulsig);
        !           296:                alarm(WSLEEP);
        !           297:                if (ioctl(fcor, PIOCWSTOP, 0) >= 0)
        !           298:                        errno = 0;
        !           299:                alarm(0);
        !           300:                if (errno == 0) {
        !           301:                        signal(SIGINT, isig);
        !           302:                        ioctl(fcor, PIOCGETPR, &p);
        !           303:                        signo = p.p_cursig;
        !           304:                        prread(UBASE + PC, &pc, sizeof(pc));
        !           305:                        if (signo == SIGTRAP || signo == SIGSTOP)
        !           306:                                signo = 0;
        !           307:                        else if (pc == extaddr("_dbsubn"))
        !           308:                                signo = 0;
        !           309:                        else
        !           310:                                sigprint();
        !           311:                        return;
        !           312:                }
        !           313:                if (errno == ENOENT)
        !           314:                        break;
        !           315:                /* still there, still running.  try again. */
        !           316:        }
        !           317:        /*
        !           318:         * process has died; wait and report status
        !           319:         * should check if it's really our child
        !           320:         */
        !           321:        signal(SIGALRM, nulsig);
        !           322:        alarm(WSLEEP);
        !           323:        while ((w = wait(&stat)) != -1 && w != pid)
        !           324:                ;
        !           325:        alarm(0);
        !           326:        pid = 0;
        !           327:        signal(SIGINT, isig);
        !           328:        close(fcor);
        !           329:        pid = 0;
        !           330:        corfil = NULL;
        !           331:        errflg = ENDPCS;
        !           332:        if (w == -1)
        !           333:                errflg = BADWAIT;
        !           334:        else {
        !           335:                if ((stat & 0177) == 0177)
        !           336:                        printf("trace status?  0%o\n", stat);
        !           337:                else {
        !           338:                        if ((signo = stat & 0177) != 0)
        !           339:                                sigprint();
        !           340:                        if (stat & 0200) {
        !           341:                                printf(" - core dumped");
        !           342:                                corfil = "core";
        !           343:                                setcor();
        !           344:                        }
        !           345:                        printf("\n");
        !           346:                }
        !           347:        }
        !           348: }
        !           349: 
        !           350: nulsig() {}
        !           351: 
        !           352: REGLIST reglist[];
        !           353: readregs()
        !           354: {
        !           355:        /*get REG values from pcs*/
        !           356:        REG i;
        !           357:        FOR i=24; --i>=0; 
        !           358:        DO prread(UBASE + reglist[i].roffs, (char *)&u + reglist[i].roffs, sizeof(int));
        !           359:        OD
        !           360:        userpc = *(ADDR *)((char *)&u + PC);
        !           361: }
        !           362: 
        !           363: char 
        !           364: readchar() {
        !           365:        lastc = *argsp++;
        !           366:        if (lastc == '\0') lastc = '\n';
        !           367:        return(lastc);
        !           368: }
        !           369: 
        !           370: char
        !           371: rdc()
        !           372: {
        !           373:        register char c;
        !           374: 
        !           375:        c = *argsp++;
        !           376:        return(c == '\0' ? '\n' : c);
        !           377: }
        !           378: 
        !           379: /*
        !           380:  * miscellaneous /proc hooks
        !           381:  */
        !           382: 
        !           383: setrun(mode, pc, sig)
        !           384: {
        !           385:        int ps;
        !           386: 
        !           387:        if (pc != 1)
        !           388:                prwrite(UBASE + PC, &pc, sizeof(pc));
        !           389:        if (mode == SINGLE) {
        !           390:                prread(UBASE + PSL, &ps, sizeof(ps));
        !           391:                ps |= TBIT;
        !           392:                prwrite(UBASE + PSL, &ps, sizeof(ps));
        !           393:        }
        !           394:        if (sig == 0)
        !           395:                ioctl(fcor, PIOCCSIG, 0);
        !           396:        ioctl(fcor, PIOCRUN, 0);
        !           397: }
        !           398: 
        !           399: killpcs()
        !           400: {
        !           401:        long ksig = SIGKILL;
        !           402: 
        !           403:        ioctl(fcor, PIOCCSIG, 0);
        !           404:        ioctl(fcor, PIOCKILL, &ksig);
        !           405:        ioctl(fcor, PIOCRUN, 0);
        !           406:        /*
        !           407:         * assert that it's our child
        !           408:         */
        !           409:        while (wait((int *)0) >= 0)
        !           410:                ;
        !           411: }
        !           412: 
        !           413: int
        !           414: openproc(id)
        !           415: int id;
        !           416: {
        !           417:        char buf[20];
        !           418:        int fd;
        !           419: 
        !           420:        sprintf(buf, "/proc/%d", id);
        !           421:        if ((fd = open(buf, 2)) < 0) {
        !           422:                perror("can't open process");
        !           423:                longjmp(env, 0);
        !           424:        }
        !           425:        return (fd);
        !           426: }
        !           427: 
        !           428: prread(addr, buf, size)
        !           429: char *buf;
        !           430: {
        !           431: 
        !           432:        lseek(fcor, (long)addr, 0);
        !           433:        if (read(fcor, buf, size) != size)
        !           434:                errflg = "can't read process";
        !           435: }
        !           436: 
        !           437: prwrite(addr, buf, size)
        !           438: char *buf;
        !           439: {
        !           440: 
        !           441:        lseek(fcor, (long)addr, 0);
        !           442:        if (write(fcor, buf, size) != size)
        !           443:                errflg = "can't read process";
        !           444: }

unix.superglobalmegacorp.com

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