Annotation of 43BSDTahoe/sys/kdb/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.5 (Berkeley) 12/15/86
                      7:  */
                      8: 
                      9: #include "../kdb/defs.h"
                     10: 
                     11: char   *BADRAD;
                     12: 
                     13: ADDR   lastframe;
                     14: ADDR   callpc;
                     15: 
                     16: char   *BADMOD;
                     17: char   *lp;
                     18: long   maxpos;
                     19: int    radix;
                     20: char   lastc;
                     21: 
                     22: /* breakpoints */
                     23: BKPTR  bkpthead;
                     24: 
                     25: extern REGLIST reglist[];
                     26: 
                     27: /* general printing routines ($) */
                     28: 
                     29: printtrace(modif)
                     30: {
                     31:        register narg, i;
                     32:        register BKPTR bkptr;
                     33:        register ADDR word;
                     34:        register char *comptr;
                     35:        register ADDR argp, frame;
                     36:        register struct nlist *sp;
                     37:        int ntramp;
                     38:        register struct  proc *p;
                     39:        extern struct proc *allproc;
                     40: 
                     41:        if (cntflg==0)
                     42:                cntval = -1;
                     43:        switch (modif) {
                     44: 
                     45:        case 'd':
                     46:                if (adrflg) {
                     47:                        if (adrval < 2 || adrval > 16)
                     48:                                error(BADRAD);
                     49:                        radix = adrval;
                     50:                }
                     51:                printf("radix=%d base ten", radix);
                     52:                break;
                     53: 
                     54:        case 'w': case 'W':
                     55:                printf("maxpos=%d", maxpos=(adrflg?adrval:MAXPOS));
                     56:                break;
                     57: 
                     58:        case 's': case 'S':
                     59:                printf("maxoff=%d", maxoff=(adrflg?adrval:MAXOFF));
                     60:                break;
                     61: 
                     62:        case 'v': case 'V':
                     63:                printf("variables\n");
                     64:                for (i=0;i<=35;i++)
                     65:                        if (var[i]) {
                     66:                                printc((i<=9 ? '0' : 'a'-10) + i);
                     67:                                printf(" = %R\n",var[i]);
                     68:                        }
                     69:                break;
                     70: 
                     71:        case 0: case '?':
                     72:                if (p = (struct proc *)var[varchk('p')])
                     73:                        printf("pid = %d\n", p->p_pid);
                     74:                else
                     75:                        printf("in idle loop\n");
                     76:                printtrap(var[varchk('t')], var[varchk('c')]);
                     77:                /* fall thru... */
                     78:        case 'r': case 'R':
                     79:                printregs(modif);
                     80:                return;
                     81: 
                     82:        case 'c': case 'C':
                     83:                if (adrflg) {
                     84:                        frame = adrval;
                     85:                        callpc = getprevpc(frame);
                     86:                } else {
                     87:                        frame = pcb.pcb_fp;
                     88:                        callpc = pcb.pcb_pc;
                     89:                }
                     90:                lastframe = NOFRAME;
                     91:                ntramp = 0;
                     92:                while (cntval-- && frame != NOFRAME) {
                     93:                        char *name;
                     94: 
                     95:                        chkerr();
                     96:                        /* check for pc in pcb (signal trampoline code) */
                     97:                        if (issignalpc(callpc)) {
                     98:                                name = "sigtramp";
                     99:                                ntramp++;
                    100:                        } else {
                    101:                                ntramp = 0;
                    102:                                (void) findsym((long)callpc, ISYM);
                    103:                                if (cursym)
                    104:                                        name = cursym->n_un.n_name;
                    105:                                else
                    106:                                        name = "?";
                    107:                        }
                    108:                        printf("%s(", name);
                    109:                        narg = getnargs(frame);
                    110:                        argp = frame;
                    111:                        if (ntramp != 1)
                    112:                                while (narg) {
                    113:                                        printf("%R",
                    114:                                            get((off_t)(argp = nextarg(argp)),
                    115:                                                DSP));
                    116:                                        if (--narg != 0)
                    117:                                                printc(',');
                    118:                                }
                    119:                        printf(") at ");
                    120:                        psymoff((long)callpc, ISYM, "\n");
                    121: 
                    122:                        if (modif=='C') {
                    123:                                while (localsym((long)frame)) {
                    124:                                        word = get((off_t)localval, DSP);
                    125:                                        printf("%8t%s:%10t",
                    126:                                            cursym->n_un.n_name);
                    127:                                        if (errflg) {
                    128:                                                printf("?\n");
                    129:                                                errflg = 0;
                    130:                                        } else
                    131:                                                printf("%R\n", word);
                    132:                                }
                    133:                        }
                    134:                        if (ntramp != 1) {
                    135:                                callpc = getprevpc(frame);
                    136:                                lastframe = frame;
                    137:                                frame = getprevframe(frame);
                    138:                        } else
                    139:                                callpc = getsignalpc(lastframe);
                    140:                        if (!adrflg && !INSTACK(frame))
                    141:                                break;
                    142:                }
                    143:                break;
                    144: 
                    145:                /*print externals*/
                    146:        case 'e': case 'E':
                    147:                for (sp = symtab; sp < esymtab; sp++)
                    148:                        if (sp->n_type==(N_DATA|N_EXT) ||
                    149:                            sp->n_type==(N_BSS|N_EXT))
                    150:                                printf("%s:%12t%R\n", sp->n_un.n_name,
                    151:                                        get((off_t)sp->n_value, DSP));
                    152:                break;
                    153: 
                    154:                /*print breakpoints*/
                    155:        case 'b': case 'B':
                    156:                printf("breakpoints\ncount%8tbkpt%24tcommand\n");
                    157:                for (bkptr=bkpthead; bkptr; bkptr=bkptr->nxtbkpt)
                    158:                        if (bkptr->flag) {
                    159:                                printf("%-8.8d",bkptr->count);
                    160:                                psymoff((long)bkptr->loc,ISYM,"%24t");
                    161:                                comptr=bkptr->comm;
                    162:                                while (*comptr)
                    163:                                        printc(*comptr++);
                    164:                        }
                    165:                break;
                    166: 
                    167:        case 'l':
                    168:                for (p = allproc; p; p = p->p_nxt) {
                    169:                        printf("%X pid %5d %c", p, p->p_pid,
                    170:                                p->p_stat == SSLEEP ? 'S' :
                    171:                                p->p_stat == SRUN ? 'R':
                    172:                                p->p_stat == SIDL ? 'I':
                    173:                                p->p_stat == SSTOP ? 'T' : '?');
                    174:                        if (p->p_wchan) {
                    175:                                printf(" wait ");
                    176:                                psymoff((long)p->p_wchan, ISYM, "");
                    177:                        }
                    178:                        printc(EOR);
                    179:                }
                    180:                break;
                    181: 
                    182:        default:
                    183:                error(BADMOD);
                    184:        }
                    185: }
                    186: 
                    187: static
                    188: printregs(c)
                    189: {
                    190:        register REGPTR p;
                    191:        ADDR v;
                    192: 
                    193:        for (p = reglist; p->rname; p++) {
                    194:                if (c != 'R' && ishiddenreg(p))
                    195:                        continue;
                    196:                v = *p->rkern;
                    197:                printf("%s%6t%R %16t", p->rname, v);
                    198:                valpr((long)v, p->rkern == &pcb.pcb_pc ? ISYM : DSYM);
                    199:                printc(EOR);
                    200:        }
                    201:        printpc();
                    202: }
                    203: 
                    204: getreg(regnam)
                    205: {
                    206:        register REGPTR p;
                    207:        register char *regptr;
                    208:        char *olp;
                    209: 
                    210:        olp = lp;
                    211:        for (p = reglist; p->rname; p++) {
                    212:                regptr = p->rname;
                    213:                if (regnam == *regptr++) {
                    214:                        while (*regptr)
                    215:                                if (readchar() != *regptr++) {
                    216:                                        --regptr;
                    217:                                        break;
                    218:                                }
                    219:                        if (*regptr)
                    220:                                lp = olp;
                    221:                        else
                    222:                                return ((int)p->rkern);
                    223:                }
                    224:        }
                    225:        lp = olp;
                    226:        return (-1);
                    227: }
                    228: 
                    229: printpc()
                    230: {
                    231: 
                    232:        psymoff((long)pcb.pcb_pc, ISYM, ":%16t");
                    233:        printins(ISP, (long)chkget((off_t)pcb.pcb_pc, ISP));
                    234:        printc(EOR);
                    235: }

unix.superglobalmegacorp.com

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