[BACK]Return to db_trace.c CVS log [TXT][DIR] Up to [local] / sys / arch / powerpc / ddb

Annotation of sys/arch/powerpc/ddb/db_trace.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: db_trace.c,v 1.4 2003/10/15 01:06:13 drahn Exp $      */
        !             2: /*     $NetBSD: db_trace.c,v 1.15 1996/02/22 23:23:41 gwr Exp $        */
        !             3:
        !             4: /*
        !             5:  * Mach Operating System
        !             6:  * Copyright (c) 1992 Carnegie Mellon University
        !             7:  * All Rights Reserved.
        !             8:  *
        !             9:  * Permission to use, copy, modify and distribute this software and its
        !            10:  * documentation is hereby granted, provided that both the copyright
        !            11:  * notice and this permission notice appear in all copies of the
        !            12:  * software, derivative works or modified versions, and any portions
        !            13:  * thereof, and that both notices appear in supporting documentation.
        !            14:  *
        !            15:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            16:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            17:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            18:  *
        !            19:  * Carnegie Mellon requests users of this software to return to
        !            20:  *
        !            21:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
        !            22:  *  School of Computer Science
        !            23:  *  Carnegie Mellon University
        !            24:  *  Pittsburgh PA 15213-3890
        !            25:  *
        !            26:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            27:  * the rights to redistribute these changes.
        !            28:  */
        !            29:
        !            30: #include <sys/param.h>
        !            31: #include <sys/systm.h>
        !            32: #include <sys/proc.h>
        !            33:
        !            34: #include <machine/db_machdep.h>
        !            35: #include <machine/signal.h>
        !            36: #include <machine/pcb.h>
        !            37:
        !            38: #include <ddb/db_access.h>
        !            39: #include <ddb/db_sym.h>
        !            40: #include <ddb/db_variables.h>
        !            41: #include <ddb/db_interface.h>
        !            42: #include <ddb/db_output.h>
        !            43:
        !            44: int db_read32(u_int32_t paddr, u_int32_t *value);
        !            45:
        !            46: db_regs_t ddb_regs;
        !            47:
        !            48: struct db_variable db_regs[] = {
        !            49:        { "r0",  (long *)&(DDB_REGS->tf.fixreg[0]),     FCN_NULL },
        !            50:        { "r1",  (long *)&(DDB_REGS->tf.fixreg[1]),     FCN_NULL },
        !            51:        { "r2",  (long *)&(DDB_REGS->tf.fixreg[2]),     FCN_NULL },
        !            52:        { "r3",  (long *)&(DDB_REGS->tf.fixreg[3]),     FCN_NULL },
        !            53:        { "r4",  (long *)&(DDB_REGS->tf.fixreg[4]),     FCN_NULL },
        !            54:        { "r5",  (long *)&(DDB_REGS->tf.fixreg[5]),     FCN_NULL },
        !            55:        { "r6",  (long *)&(DDB_REGS->tf.fixreg[6]),     FCN_NULL },
        !            56:        { "r7",  (long *)&(DDB_REGS->tf.fixreg[7]),     FCN_NULL },
        !            57:        { "r8",  (long *)&(DDB_REGS->tf.fixreg[8]),     FCN_NULL },
        !            58:        { "r9",  (long *)&(DDB_REGS->tf.fixreg[9]),     FCN_NULL },
        !            59:        { "r10", (long *)&(DDB_REGS->tf.fixreg[10]),    FCN_NULL },
        !            60:        { "r11", (long *)&(DDB_REGS->tf.fixreg[11]),    FCN_NULL },
        !            61:        { "r12", (long *)&(DDB_REGS->tf.fixreg[12]),    FCN_NULL },
        !            62:        { "r13", (long *)&(DDB_REGS->tf.fixreg[13]),    FCN_NULL },
        !            63:        { "r14", (long *)&(DDB_REGS->tf.fixreg[13]),    FCN_NULL },
        !            64:        { "r15", (long *)&(DDB_REGS->tf.fixreg[13]),    FCN_NULL },
        !            65:        { "r16", (long *)&(DDB_REGS->tf.fixreg[13]),    FCN_NULL },
        !            66:        { "r17", (long *)&(DDB_REGS->tf.fixreg[17]),    FCN_NULL },
        !            67:        { "r18", (long *)&(DDB_REGS->tf.fixreg[18]),    FCN_NULL },
        !            68:        { "r19", (long *)&(DDB_REGS->tf.fixreg[19]),    FCN_NULL },
        !            69:        { "r20", (long *)&(DDB_REGS->tf.fixreg[20]),    FCN_NULL },
        !            70:        { "r21", (long *)&(DDB_REGS->tf.fixreg[21]),    FCN_NULL },
        !            71:        { "r22", (long *)&(DDB_REGS->tf.fixreg[22]),    FCN_NULL },
        !            72:        { "r23", (long *)&(DDB_REGS->tf.fixreg[23]),    FCN_NULL },
        !            73:        { "r24", (long *)&(DDB_REGS->tf.fixreg[24]),    FCN_NULL },
        !            74:        { "r25", (long *)&(DDB_REGS->tf.fixreg[25]),    FCN_NULL },
        !            75:        { "r26", (long *)&(DDB_REGS->tf.fixreg[26]),    FCN_NULL },
        !            76:        { "r27", (long *)&(DDB_REGS->tf.fixreg[27]),    FCN_NULL },
        !            77:        { "r28", (long *)&(DDB_REGS->tf.fixreg[28]),    FCN_NULL },
        !            78:        { "r29", (long *)&(DDB_REGS->tf.fixreg[29]),    FCN_NULL },
        !            79:        { "r30", (long *)&(DDB_REGS->tf.fixreg[30]),    FCN_NULL },
        !            80:        { "r31", (long *)&(DDB_REGS->tf.fixreg[31]),    FCN_NULL },
        !            81:        { "lr", (long *)&(DDB_REGS->tf.lr),     FCN_NULL },
        !            82:        { "cr", (long *)&(DDB_REGS->tf.cr),     FCN_NULL },
        !            83:        { "xer", (long *)&(DDB_REGS->tf.xer),   FCN_NULL },
        !            84:        { "ctr", (long *)&(DDB_REGS->tf.ctr),   FCN_NULL },
        !            85:        { "iar", (long *)&(DDB_REGS->tf.srr0),  FCN_NULL },
        !            86:        { "msr", (long *)&(DDB_REGS->tf.srr1),  FCN_NULL },
        !            87: };
        !            88:
        !            89: struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
        !            90:
        !            91: extern label_t *db_recover;
        !            92:
        !            93: /*
        !            94:  * this is probably hackery.
        !            95:  */
        !            96: void
        !            97: db_save_regs(struct trapframe *frame)
        !            98: {
        !            99:        bcopy(frame, &(ddb_regs.tf), sizeof (struct trapframe));
        !           100: }
        !           101:
        !           102: int
        !           103: db_read32(u_int32_t paddr, u_int32_t *value)
        !           104: {
        !           105:        faultbuf env;
        !           106:        faultbuf *old_onfault = curpcb->pcb_onfault;
        !           107:        if (setfault(&env)) {
        !           108:                curpcb->pcb_onfault = old_onfault;
        !           109:                return EFAULT;
        !           110:        }
        !           111:        *value = *(u_int32_t *)paddr;
        !           112:        curpcb->pcb_onfault = old_onfault;
        !           113:        return 0;
        !           114: }
        !           115:
        !           116: db_expr_t
        !           117: db_dumpframe(u_int32_t pframe, int (*pr)(const char *, ...))
        !           118: {
        !           119:        u_int32_t nextframe;
        !           120:        u_int32_t lr;
        !           121:        char *name;
        !           122:        db_expr_t offset;
        !           123:
        !           124:        if (db_read32(pframe, &nextframe) == EFAULT) {
        !           125:                return 0;
        !           126:        }
        !           127:
        !           128:        if (db_read32(pframe+4, &lr) == EFAULT) {
        !           129:                return 0;
        !           130:        }
        !           131:
        !           132:        db_find_sym_and_offset(lr-4, &name, &offset);
        !           133:        if (!name) {
        !           134:                name = "0";
        !           135:                offset = lr-4;
        !           136:        }
        !           137:        (*pr)("%08x: %s+0x%x fp %x nfp %x\n",
        !           138:                lr-4, name, offset, pframe, nextframe);
        !           139:
        !           140:        return nextframe;
        !           141: }
        !           142:
        !           143: /*
        !           144:  *     Frame tracing.
        !           145:  */
        !           146: void
        !           147: db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count,
        !           148:     char *modif, int (*pr)(const char *, ...))
        !           149: {
        !           150:
        !           151:        if (count == 0 || count == -1)
        !           152:                count = INT_MAX;
        !           153:        if (have_addr == 0){
        !           154:                addr = ddb_regs.tf.fixreg[1];
        !           155:        }
        !           156:        while (addr != 0 && count > 0) {
        !           157:                addr = db_dumpframe(addr, pr);
        !           158:                count --;
        !           159:        }
        !           160: }

CVSweb