Annotation of cci/usr/src/bin/cdb/bp.c, revision 1.1

1.1     ! root        1: static char sccsid[] = "@(#)bp.c       2.6";
        !             2: 
        !             3: #include <ctype.h>
        !             4: #include "cdb.h"
        !             5: 
        !             6: 
        !             7: #ifdef M68000
        !             8: #define cbBp   2       /* size of a breakpoint */
        !             9: #ifdef SUN
        !            10: short  vinsBp = 0x4e4f;        /* a 'trap #15' instruction */
        !            11: #else
        !            12: short  vinsBp = 0x4e41;        /* the breakpoint instruction */
        !            13: #endif
        !            14: #endif
        !            15: 
        !            16: #ifdef ONYX
        !            17: #define cbBp   2       /* size of a breakpoint */
        !            18: int    vinsBp = 0x7fff;        /* the breakpoint instruction */
        !            19: #endif
        !            20: 
        !            21: #ifdef TAHOE
        !            22: #define cbBp   1       /* size of BPT instruction */
        !            23: int    vinsBp = 0x30;  /* a BPT instruction */
        !            24: #endif
        !            25: 
        !            26: #ifdef VAX
        !            27: #define cbBp   1       /* size of BPT instruction */
        !            28: int    vinsBp = 03;    /* a BPT instruction */
        !            29: #endif
        !            30: 
        !            31: export int     vibpMac, vibpMax;
        !            32: export int     vibpTemp;       /* always 0, used for temp BP execution */
        !            33: export pBPR    vrgBp;  /* allocated in InitAll */
        !            34: 
        !            35: #ifdef REGULUS
        !            36: local void CopyBp(bp1, bp2)
        !            37: pBPR   bp1, bp2;
        !            38: {
        !            39:        bp1->adr = bp2->adr;
        !            40:        bp1->count = bp2->count;
        !            41:        bp1->inst = bp2->inst;
        !            42:        strncpy(bp1->sbBp, bp2->sbBp, 100);
        !            43: } /* CopyBp */
        !            44: #endif
        !            45: 
        !            46: /* L I S T   B P */
        !            47: 
        !            48: export void ListBp()
        !            49: {
        !            50:        int     ibp;
        !            51: 
        !            52:        for (ibp=vibpTemp+1; ibp< vibpMac; ibp++) {
        !            53:                printf("%2d ", ibp);
        !            54:                PrintPos(vrgBp[ibp].adr, fmtProc+fmtLn+fmtSave);
        !            55:                printf("  count: %d", vrgBp[ibp].count);
        !            56:                /*      for debugging purposes
        !            57:                            printf("  addr: %d", vrgBp[ibp].adr);
        !            58:                            printf("  inst: %d", vrgBp[ibp].inst);
        !            59:                        */
        !            60:                if (vrgBp[ibp].count <= 0)
        !            61:                        printf(" (temp)");
        !            62:                if (vrgBp[ibp].sbBp[0] != chNull)
        !            63:                        printf("   <%s>", vrgBp[ibp].sbBp);
        !            64:                printf("\n");
        !            65:        } /* for */
        !            66: } /* ListBp */
        !            67: 
        !            68: 
        !            69: /* F   C L E A R   B P */
        !            70: 
        !            71: export FLAGT FClearBp(adr)
        !            72: ADRT   adr;
        !            73: {
        !            74:        int     ibp;
        !            75: 
        !            76:        for (ibp=vibpTemp+1; ibp<vibpMac; ibp++) {
        !            77:                if (vrgBp[ibp].adr == adr) {
        !            78: #ifdef REGULUS
        !            79:                        CopyBp(vrgBp+ibp, vrgBp+(vibpMac-1));
        !            80: #else
        !            81:                        vrgBp[ibp] = vrgBp[vibpMac-1];
        !            82: #endif
        !            83:                        vibpMac--;
        !            84:                        return(true);
        !            85:                } /* if */
        !            86:        } /* for */
        !            87:        return(false);
        !            88: } /* FClearBp */
        !            89: 
        !            90: 
        !            91: /* C L E A R   A L L */
        !            92: 
        !            93: export void ClearAll()
        !            94: {
        !            95:        vibpMac = 1;    /* we allow for the temp in 0 */
        !            96:        printf("All breakpoints deleted\n");
        !            97: } /* ClearAll */
        !            98: 
        !            99: 
        !           100: /* I B P   F   B R K   I N */
        !           101: 
        !           102: export int IbpFBrkIn(pc)
        !           103: ADRT   pc;
        !           104: {
        !           105:        int             i;
        !           106: 
        !           107:        for (i=vibpTemp+1; i < vibpMac; i++) {
        !           108:                if (vrgBp[i].adr == pc)
        !           109:                        return(i);  /* don't install anything if we are on a break */
        !           110:        } /* for */
        !           111: 
        !           112:        for (i=vibpTemp+1; i < vibpMac; i++) {
        !           113:                GetBlock(vrgBp[i].adr, spaceText, (ADRT)&(vrgBp[i].inst), cbBp);
        !           114: #ifdef TAHOE
        !           115:                PutBlock(vrgBp[i].adr, spaceText, ((char *)&vinsBp)+3, cbBp);
        !           116: #else
        !           117:                PutBlock(vrgBp[i].adr, spaceText, (ADRT)&vinsBp, cbBp);
        !           118: #endif
        !           119:        } /* for */
        !           120:        return(ibpNil);
        !           121: } /* IbpFBrkIn */
        !           122: 
        !           123: 
        !           124: /* B R K   O U T */
        !           125: 
        !           126: export int BrkOut(padr)
        !           127: ADRT   *padr;
        !           128: {
        !           129:        int             ibp, i;
        !           130: #ifdef M68000
        !           131:        ushort  val;
        !           132: #else
        !           133:        uint    val;
        !           134: #endif
        !           135:        pBPR    bp;
        !           136:        ADRT    adr;
        !           137: 
        !           138:        adr = *padr;
        !           139: #ifndef BSD41
        !           140:        /* vax backs up pc for us */
        !           141:        GetBlock(adr-cbBp, spaceText, (ADRT)&val, cbBp);
        !           142:        if (val == vinsBp) /* back up, if we are at a breakpoint */
        !           143:                *padr = adr -= cbBp;
        !           144: #endif
        !           145: 
        !           146:        /* we now restore original instructions for all active bp's */
        !           147:        ibp = ibpNil;
        !           148:        for (i=vibpTemp+1; i < vibpMac; i++) {
        !           149:                bp = vrgBp + i;
        !           150:                PutBlock(bp->adr, spaceText, (ADRT)&(bp->inst), cbBp);
        !           151:                /* put back the real instruction */
        !           152:                if (bp->count == 0) {   /* it was set by single-step */
        !           153:                        FClearBp(vrgBp[i].adr);
        !           154:                        i--;    /* FClearBp shuffles things, back up one */
        !           155:                } 
        !           156:                else if (bp->adr == adr) {
        !           157:                        /* this is THE break that we hit, adjust its count */
        !           158:                        ibp = ibpContinue;      /* ignore break, will change if appropriate */
        !           159:                        if (bp->count < 0) {
        !           160:                                /* it's a temp break */
        !           161:                                if ((bp->count += 1) == 0) {
        !           162: #ifdef REGULUS
        !           163:                                        CopyBp(vrgBp+vibpTemp, bp);
        !           164: #else
        !           165:                                        vrgBp[vibpTemp] = *bp; /* transfer into the holding slot */
        !           166: #endif
        !           167:                                        ibp = vibpTemp;
        !           168:                                        FClearBp(vrgBp[i].adr);
        !           169:                                        i--;    /* FClearBp shuffles things, back up one */
        !           170:                                } /* if */
        !           171:                        } 
        !           172:                        else {
        !           173:                                /* it's a permanent break, deal with it */
        !           174:                                if ((bp->count -= 1) <= 0) {
        !           175:                                        bp->count = 1;  /* we refresh it if it goes 0 */
        !           176:                                        ibp = i;
        !           177:                                } /* if */
        !           178:                        } /* if */
        !           179:                } /* if */
        !           180:        } /* if */
        !           181:        return(ibp);
        !           182: } /* BrkOut */
        !           183: 
        !           184: 
        !           185: /* I B P   F   A D R */
        !           186: 
        !           187: export int IbpFAdr(adr, count, sbCmd)
        !           188: ADRT   adr;
        !           189: int    count;
        !           190: char   *sbCmd;
        !           191: {
        !           192:        int             ibp;
        !           193: 
        !           194:        /* see if we already have this one - if so, reuse the slot */
        !           195:        for (ibp=vibpTemp+1; ibp<vibpMac; ibp++) {
        !           196:                if (vrgBp[ibp].adr == adr) {
        !           197:                        if (count == 0)
        !           198:                                return(ibp);    /* there's already a PERMANENT one there */
        !           199:                        else break;
        !           200:                } /* if */
        !           201:        } /* for */
        !           202: 
        !           203:        if (ibp == vibpMac) {
        !           204:                if (vibpMac >= vibpMax)
        !           205:                        UError("Ran out of breakpoints");
        !           206:                vibpMac++;
        !           207:        } /* if */
        !           208: 
        !           209:        vrgBp[ibp].adr = adr;
        !           210:        vrgBp[ibp].count = count;
        !           211:        if (sbCmd == sbNil) {
        !           212:                vrgBp[ibp].sbBp[0] = chNull;
        !           213:        } 
        !           214:        else {
        !           215:                strcpy(vrgBp[ibp].sbBp, sbCmd);
        !           216:        } /* if */
        !           217:        return(ibp);
        !           218: } /* IbpFAdr */
        !           219: 
        !           220: 
        !           221: /* I B P   F   S E T */
        !           222: 
        !           223: export int IbpFSet(chStyle, cnt, sbCmd)
        !           224: char   chStyle;
        !           225: int    cnt;
        !           226: char   *sbCmd;
        !           227: {
        !           228:        int     ipd, ibp, ipdSave, ilnSave, ifdSave, cb;
        !           229:        char    *sbSave, sbTok[50];
        !           230:        FLAGT   fTemp;
        !           231:        ADRT    pc, fp, ap;
        !           232:        TKE             tk;
        !           233: 
        !           234:        ipd = ipdSave = vipd;
        !           235:        ifdSave = vifd;
        !           236:        ilnSave = viln;
        !           237: 
        !           238:        if (isupper(chStyle)) {
        !           239:                fTemp = true;   /* upper gives a one shot breakpoint */
        !           240:                chStyle = tolower(chStyle);
        !           241:        } 
        !           242:        else {
        !           243:                fTemp = false;
        !           244:        } /* if */
        !           245: 
        !           246:        fp = vfp;
        !           247:        ap = vap;
        !           248:        pc = vpc;
        !           249:        if (cnt >= 0) {
        !           250:                /* they want to do this stack relative */
        !           251:                while ((cnt > 0) AND fp) {
        !           252:                        NextFrame(&fp, &ap, &pc);
        !           253:                        --cnt;
        !           254:                }
        !           255:                if (fp == 0)
        !           256:                        UError("Stack isn't that deep!");
        !           257:        } /* if */
        !           258: 
        !           259:        switch (chStyle) {
        !           260:        default:
        !           261:                UError("Unknown breakpoint type `%c'", chStyle);
        !           262:        case 't':       /* trace breakpoint */
        !           263:                if (cnt >= 0) {
        !           264:                        if ((ipd = IpdFAdr(pc)) == ipdNil)
        !           265:                                UError("No symbols for that procedure");
        !           266:                        vipd = ipd;
        !           267:                } 
        !           268:                else {
        !           269:                        sbSave = sbCmd;  /* in case we want to undo next line */
        !           270:                        tk = TkFStr(&sbCmd, sbTok, &cb); /* look at first item */
        !           271:                        if ( (tk == tkStr)
        !           272:                            AND ((ipd = IpdFName(sbTok)) != ipdNil) ) {
        !           273:                                vipd = ipd;
        !           274:                        } 
        !           275:                        else {
        !           276:                                /* restore string */
        !           277:                                sbCmd = sbSave;
        !           278:                        } /* if */
        !           279:                } /* if */
        !           280:                /* set break at exit */
        !           281:                ibp = IbpFSet( ((fTemp) ? 'X':'x'), -1, "Q;$result/d;c");
        !           282:                /* set break at entrance */
        !           283:                if ((sbCmd == sbNil) OR (*sbCmd == chNull))
        !           284:                        sbCmd = "Q;2t;c"; /* print caller and continue on entry */
        !           285:                ibp = IbpFSet( ((fTemp) ? 'B':'b'), -1, sbCmd);
        !           286:                printf("Tracing %s\n", vrgPd[vipd].sbProc);
        !           287:                ibp = ibpNil;   /* a signal to caller not to print anything */
        !           288:                pc = adrNil;
        !           289:                break;
        !           290:        case 'b':
        !           291:                if (cnt >= 0) {
        !           292:                        if ((ipd = IpdFAdr(pc)) == ipdNil)
        !           293:                                UError("No symbols for that procedure");
        !           294:                } 
        !           295:                else {
        !           296:                        ipd = vipd;
        !           297:                } /* if */
        !           298:                OpenIpd(ipd, true);     /* force it open */
        !           299:                pc = AdrFIfdLn(vifd, viln);
        !           300:                break;
        !           301:        case 'x':
        !           302:                if (cnt >= 0) {
        !           303:                        if ((ipd = IpdFAdr(pc)) == ipdNil)
        !           304:                                UError("No symbols for that procedure");
        !           305:                } 
        !           306:                else {
        !           307:                        ipd = vipd;
        !           308:                } /* if */
        !           309:                pc = AdrFEndOfProc(ipd);
        !           310:                break;
        !           311:        case 'u':
        !           312:                /* move past instruction which fixes the stack pointer */
        !           313:                pc = AdrFStackFix(pc);
        !           314:                break;
        !           315:        } /* switch */
        !           316: 
        !           317:        if (pc != adrNil)
        !           318:                ibp = IbpFAdr(pc, (fTemp) ? -1 : 1, sbCmd);
        !           319:        vipd = ipdSave;
        !           320:        vifd = ifdSave;
        !           321:        viln = ilnSave;
        !           322:        return(ibp);
        !           323: } /* IbpFSet */

unix.superglobalmegacorp.com

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