Annotation of 43BSDReno/sys/kdb/kdb_runpcs.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1986 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  *
        !             6:  *     @(#)kdb_runpcs.c        7.4 (Berkeley) 5/3/90
        !             7:  */
        !             8: 
        !             9: #include "../kdb/defs.h"
        !            10: 
        !            11: char   *kdblp;
        !            12: 
        !            13: /* breakpoints */
        !            14: BKPTR  kdbbkpthead;
        !            15: 
        !            16: char   kdblastc;
        !            17: 
        !            18: long   kdbdot;
        !            19: int    kdbadrflg;
        !            20: long   kdbloopcnt;
        !            21: ADDR   kdbuserpc = 1;
        !            22: 
        !            23: kdbrunpcs(runmode, execsig)
        !            24: {
        !            25:        register BKPTR bkpt;
        !            26: 
        !            27:        if (kdbadrflg)
        !            28:                kdbuserpc = kdbdot;
        !            29:        if (execsig == 0)
        !            30:                kdbprintf("kdb: running\n");
        !            31:        if (runmode==SINGLE) {
        !            32:                /*
        !            33:                 * To single step, delete the
        !            34:                 * breakpoints and invoke the
        !            35:                 * hardware single step in the
        !            36:                 * main loop.
        !            37:                 */
        !            38:                kdbdelbp();
        !            39:                reset(SINGLE);
        !            40:        }
        !            41:        /*
        !            42:         * If we're currently at a breakpoint,
        !            43:         * restore the instruction and single
        !            44:         * step before continuing.  Otherwise,
        !            45:         * we can just set our breakpoints and
        !            46:         * continue.
        !            47:         */
        !            48:        if (bkpt = kdbscanbkpt(kdbuserpc)) {
        !            49:                kdbexecbkpt(bkpt);
        !            50:                /*NOTREACHED*/
        !            51:        }
        !            52:        kdbsetbp();
        !            53:        reset(CONTIN);
        !            54: }
        !            55: 
        !            56: static int kdbexecbkptf;
        !            57: 
        !            58: /*
        !            59:  * Continue execution after a trap.
        !            60:  *
        !            61:  * If tracetrap is nonzero, we've entered here because of a
        !            62:  * trace trap.  If we're skipping a breakpoint (execbkptf),
        !            63:  * or this is the next iteration of a breakpoint, continue.
        !            64:  * If this is the next iteration of a single step, do the
        !            65:  * next step.  Otherwise return 1 if we stopped because
        !            66:  * of a breakpoint,
        !            67:  */
        !            68: kdbnextpcs(tracetrap)
        !            69:        int tracetrap;
        !            70: {
        !            71:        register BKPTR bkpt;
        !            72:        short rc;
        !            73: 
        !            74:        clrsstep();                     /* clear hardware single step */
        !            75:        kdbdelbp();
        !            76:        if (kdbexecbkptf) {
        !            77:                kdbexecbkptf = 0;
        !            78:                kdbrunpcs(CONTIN, 1);
        !            79:                /*NOTREACHED*/
        !            80:        }
        !            81:        if (!tracetrap && (bkpt = kdbscanbkpt(kdbuserpc))) {
        !            82:                /*
        !            83:                 * Stopped at a breakpoint,
        !            84:                 * execute any command.
        !            85:                 */
        !            86:                kdbdot = bkpt->loc;
        !            87:                if (bkpt->flag == BKPTEXEC ||
        !            88:                    ((bkpt->flag = BKPTEXEC) && bkpt->comm[0] != EOR &&
        !            89:                    kdbcommand(bkpt->comm, ':') && --bkpt->count)) {
        !            90:                        kdbloopcnt++;
        !            91:                        kdbexecbkpt(bkpt);
        !            92:                } else {
        !            93:                        bkpt->count = bkpt->initcnt;
        !            94:                        rc = 1;
        !            95:                }
        !            96:        } else
        !            97:                rc = 0;
        !            98:        if (--kdbloopcnt > 0)
        !            99:                kdbrunpcs(rc ? CONTIN : SINGLE, 1);
        !           100:        return (rc);
        !           101: }
        !           102: 
        !           103: #define BPOUT 0
        !           104: #define BPIN 1
        !           105: static int kdbbpstate = BPOUT;
        !           106: 
        !           107: kdbexecbkpt(bkptr)
        !           108:        BKPTR   bkptr;
        !           109: {
        !           110: 
        !           111:        kdbdelbp();
        !           112:        bkptr->flag = BKPTSET;
        !           113:        kdbexecbkptf++;
        !           114:        reset(SINGLE);
        !           115: }
        !           116: 
        !           117: BKPTR
        !           118: kdbscanbkpt(addr)
        !           119:        ADDR addr;
        !           120: {
        !           121:        register BKPTR  bkptr;
        !           122: 
        !           123:        for (bkptr = kdbbkpthead; bkptr; bkptr = bkptr->nxtbkpt)
        !           124:                if (bkptr->flag && bkptr->loc == addr)
        !           125:                        break;
        !           126:        return (bkptr);
        !           127: }
        !           128: 
        !           129: kdbdelbp()
        !           130: {
        !           131:        register off_t a;
        !           132:        register BKPTR bkptr;
        !           133: 
        !           134:        if (kdbbpstate == BPOUT)
        !           135:                return;
        !           136:        for (bkptr = kdbbkpthead; bkptr; bkptr = bkptr->nxtbkpt)
        !           137:                if (bkptr->flag) {
        !           138:                        a = bkptr->loc;
        !           139:                        kdbput((off_t)a, ISP, (long)bkptr->ins);
        !           140:                }
        !           141:        kdbbpstate = BPOUT;
        !           142: }
        !           143: 
        !           144: kdbsetbp()
        !           145: {
        !           146:        register off_t a;
        !           147:        register BKPTR bkptr;
        !           148: 
        !           149:        if (kdbbpstate == BPIN)
        !           150:                return;
        !           151:        for (bkptr = kdbbkpthead; bkptr; bkptr = bkptr->nxtbkpt)
        !           152:                if (bkptr->flag) {
        !           153:                        a = bkptr->loc;
        !           154:                        bkptr->ins = kdbget(a, ISP);
        !           155:                        kdbput(a, ISP, (long)SETBP(bkptr->ins));
        !           156:                }
        !           157:        kdbbpstate = BPIN;
        !           158: }

unix.superglobalmegacorp.com

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