Annotation of 43BSDReno/sys/kdb/Old/kdb_print.c, revision 1.1.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_print.c 7.16 (Berkeley) 5/3/90
                      7:  */
                      8: 
                      9: #include "machine/mtpr.h"
                     10: #undef ISP
                     11: #include "../kdb/defs.h"
                     12: #undef CTRL
                     13: #include "ioctl.h"
                     14: #include "tty.h"
                     15: #include "vnode.h"
                     16: #include "mount.h"
                     17: 
                     18: char   *BADRAD;
                     19: 
                     20: ADDR   lastframe;
                     21: ADDR   callpc;
                     22: 
                     23: char   *BADMOD;
                     24: char   *lp;
                     25: long   maxpos;
                     26: int    radix;
                     27: char   lastc;
                     28: 
                     29: /* breakpoints */
                     30: BKPTR  bkpthead;
                     31: 
                     32: extern REGLIST reglist[];
                     33: 
                     34: /* general printing routines ($) */
                     35: 
                     36: printtrace(modif)
                     37: {
                     38:        register narg, i;
                     39:        register BKPTR bkptr;
                     40:        register ADDR word;
                     41:        register char *comptr;
                     42:        register ADDR argp, frame;
                     43:        register struct nlist *sp;
                     44:        int ntramp;
                     45:        register struct proc *p;
                     46:        extern struct proc *allproc;
                     47: 
                     48:        if (cntflg==0)
                     49:                cntval = -1;
                     50:        switch (modif) {
                     51: 
                     52:        case 'd':
                     53:                if (adrflg) {
                     54:                        if (adrval < 2 || adrval > 16)
                     55:                                error(BADRAD);
                     56:                        radix = adrval;
                     57:                }
                     58:                printf("radix=%d base ten", radix);
                     59:                break;
                     60: 
                     61:        case 'w': case 'W':
                     62:                printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS));
                     63:                break;
                     64: 
                     65:        case 's': case 'S':
                     66:                printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF));
                     67:                break;
                     68: 
                     69:        case 'V':
                     70:                printf("variables\n");
                     71:                for (i=0;i<=35;i++)
                     72:                        if (var[i]) {
                     73:                                printc((i<=9 ? '0' : 'a'-10) + i);
                     74:                                printf(" = %R\n",var[i]);
                     75:                        }
                     76:                break;
                     77: 
                     78:        case 0: case '?':
                     79:                if (p = (struct proc *)var[varchk('p')])
                     80:                        printf("pid = %d\n", p->p_pid);
                     81:                else
                     82:                        printf("in idle loop\n");
                     83:                printtrap(var[varchk('t')], var[varchk('c')]);
                     84:                /* fall thru... */
                     85:        case 'r': case 'R':
                     86:                printregs(modif);
                     87:                return;
                     88: 
                     89:        case 'c': case 'C':
                     90:                if (adrflg) {
                     91:                        frame = adrval;
                     92:                        callpc = getprevpc(frame);
                     93:                } else {
                     94:                        frame = pcb.pcb_fp;
                     95:                        callpc = pcb.pcb_pc;
                     96:                }
                     97:                lastframe = NOFRAME;
                     98:                ntramp = 0;
                     99:                while (cntval-- && frame != NOFRAME) {
                    100:                        char *name;
                    101: 
                    102:                        chkerr();
                    103:                        /* check for pc in pcb (signal trampoline code) */
                    104:                        if (issignalpc(callpc)) {
                    105:                                name = "sigtramp";
                    106:                                ntramp++;
                    107:                        } else {
                    108:                                ntramp = 0;
                    109:                                (void) findsym((long)callpc, ISYM);
                    110:                                if (cursym)
                    111:                                        name = cursym->n_un.n_name;
                    112:                                else
                    113:                                        name = "?";
                    114:                        }
                    115:                        printf("%s(", name);
                    116:                        narg = getnargs(frame);
                    117:                        if (narg > 10)
                    118:                                narg = 10;
                    119:                        argp = frame;
                    120:                        if (ntramp != 1)
                    121:                                while (narg) {
                    122:                                        printf("%R",
                    123:                                            get((off_t)(argp = nextarg(argp)),
                    124:                                                DSP));
                    125:                                        if (--narg != 0)
                    126:                                                printc(',');
                    127:                                }
                    128:                        printf(") at ");
                    129:                        psymoff((long)callpc, ISYM, "\n");
                    130: 
                    131:                        if (modif=='C') {
                    132:                                while (localsym((long)frame)) {
                    133:                                        word = get((off_t)localval, DSP);
                    134:                                        printf("%8t%s:%10t",
                    135:                                            cursym->n_un.n_name);
                    136:                                        if (errflg) {
                    137:                                                printf("?\n");
                    138:                                                errflg = 0;
                    139:                                        } else
                    140:                                                printf("%R\n", word);
                    141:                                }
                    142:                        }
                    143:                        if (ntramp != 1) {
                    144:                                callpc = getprevpc(frame);
                    145:                                lastframe = frame;
                    146:                                frame = getprevframe(frame);
                    147:                        } else
                    148:                                callpc = getsignalpc(lastframe);
                    149:                        if (!adrflg && !INSTACK(frame))
                    150:                                break;
                    151:                }
                    152:                break;
                    153: 
                    154:                /*print externals*/
                    155:        case 'e': case 'E':
                    156:                for (sp = symtab; sp < esymtab; sp++)
                    157:                        if (sp->n_type==(N_DATA|N_EXT) ||
                    158:                            sp->n_type==(N_BSS|N_EXT))
                    159:                                printf("%s:%12t%R\n", sp->n_un.n_name,
                    160:                                        get((off_t)sp->n_value, DSP));
                    161:                break;
                    162: 
                    163:                /*print breakpoints*/
                    164:        case 'b': case 'B':
                    165:                printf("breakpoints\ncount%8tbkpt%24tcommand\n");
                    166:                for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
                    167:                        if (bkptr->flag) {
                    168:                                printf("%-8.8d",bkptr->count);
                    169:                                psymoff((long)bkptr->loc,ISYM,"%24t");
                    170:                                comptr=bkptr->comm;
                    171:                                while (*comptr)
                    172:                                        printc(*comptr++);
                    173:                        }
                    174:                break;
                    175: 
                    176:        case 'k':
                    177:                panic("kdb requested panic");
                    178:                /* NOTREACHED */
                    179: 
                    180:        case 'l': {
                    181:                struct pte savemmap;
                    182:                extern char vmmap[];
                    183: 
                    184:                savemmap = mmap[0];
                    185:                for (p = allproc; p; p = p->p_nxt) {
                    186:                        printf("%X pid %5d%c%5d %c ", p, p->p_pid,
                    187:                                p == (struct proc *)var[varchk('p')]? '*' : ' ',
                    188:                                p->p_ppid,
                    189:                                p->p_stat == SSLEEP ? 'S' :
                    190:                                p->p_stat == SRUN ? 'R':
                    191:                                p->p_stat == SIDL ? 'I':
                    192:                                p->p_stat == SSTOP ? 'T' : '?');
                    193:                        if (p->p_wchan)
                    194:                                psymoff((long)p->p_wchan, ISYM, "");
                    195:                        if ((p->p_flag & SLOAD) && p->p_addr) {
                    196:                                int i;
                    197:                                *(int *)mmap = *(int *)p->p_addr;
                    198:                                mtpr(TBIS, vmmap);
                    199: #define U      ((struct user *)vmmap)
                    200: #ifdef not_until_uarea_completely_mapped
                    201:                                if (U->u_ttyp)
                    202:                                        printf(" ctty %x ", U->u_ttyp);
                    203: #endif
                    204:                                printf(" %.8s ", p->p_comm);
                    205: #undef U
                    206:                        }
                    207: 
                    208:                        printc(EOR);
                    209:                }
                    210:                mmap[0] = savemmap;
                    211:                mtpr(TBIS, vmmap);
                    212:                break;
                    213:        }
                    214: 
                    215:        case 't':       /* XXX - debug */
                    216:                if (adrflg) {
                    217:                      printf("dev       state  rawq   canq  outq  lwat hwat\n");
                    218: 
                    219: #define T      ((struct tty *)adrval)  
                    220:                        printf("%x  %x %d %d %d %d %d\n", T->t_dev, 
                    221:                                T->t_state, T->t_rawq.c_cc, 
                    222:                                T->t_canq.c_cc, T->t_outq.c_cc,
                    223:                                T->t_lowat, T->t_hiwat);
                    224:               printf(" &rawq    &canq      &outq    &outq.c_cf  &rawq.c_cf\n");
                    225:                        printf(" %x %x  %x %x %x \n", &T->t_rawq, 
                    226:                                &T->t_canq, &T->t_outq, &T->t_outq.c_cf, 
                    227:                                &T->t_rawq.c_cf);
                    228: #undef T
                    229:                }
                    230: 
                    231:        case 'v': {
                    232:                register struct mount *mp;
                    233:                register struct vnode *vp;
                    234: 
                    235:                printf("Locked vnodes\n");
                    236:                mp = rootfs;
                    237:                do {
                    238:                        for (vp = mp->m_mounth; vp; vp = vp->v_mountf)
                    239:                                if (VOP_ISLOCKED(vp))
                    240:                                        vprint((char *)0, vp);
                    241:                        mp = mp->m_next;
                    242:                } while (mp != rootfs);
                    243:                break;
                    244:        }
                    245: 
                    246:        default:
                    247:                error(BADMOD);
                    248:        }
                    249: }
                    250: 
                    251: static
                    252: printregs(c)
                    253: {
                    254:        register REGPTR p;
                    255:        ADDR v;
                    256: 
                    257:        for (p = reglist; p->rname; p++) {
                    258:                if (c != 'R' && ishiddenreg(p))
                    259:                        continue;
                    260:                v = *p->rkern;
                    261:                printf("%s%6t%R %16t", p->rname, v);
                    262:                valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM);
                    263:                printc(EOR);
                    264:        }
                    265:        printpc();
                    266: }
                    267: 
                    268: getreg(regnam)
                    269: {
                    270:        register REGPTR p;
                    271:        register char *regptr;
                    272:        char *olp;
                    273: 
                    274:        olp = lp;
                    275:        for (p = reglist; p->rname; p++) {
                    276:                regptr = p->rname;
                    277:                if (regnam == *regptr++) {
                    278:                        while (*regptr)
                    279:                                if (readchar() != *regptr++) {
                    280:                                        --regptr;
                    281:                                        break;
                    282:                                }
                    283:                        if (*regptr)
                    284:                                lp = olp;
                    285:                        else
                    286:                                return ((int)p->rkern);
                    287:                }
                    288:        }
                    289:        lp = olp;
                    290:        return (-1);
                    291: }
                    292: 
                    293: printpc()
                    294: {
                    295: 
                    296:        psymoff((long)pcb.pcb_pc, ISYM, ":%16t");
                    297:        printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP));
                    298:        printc(EOR);
                    299: }

unix.superglobalmegacorp.com

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