[BACK]Return to db_interface.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa64 / hppa64

Annotation of sys/arch/hppa64/hppa64/db_interface.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: db_interface.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2005 Michael Shalayeff
        !             5:  * All rights reserved.
        !             6:  *
        !             7:  * Permission to use, copy, modify, and distribute this software for any
        !             8:  * purpose with or without fee is hereby granted, provided that the above
        !             9:  * copyright notice and this permission notice appear in all copies.
        !            10:  *
        !            11:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            12:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            13:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            14:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            15:  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
        !            16:  * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            17:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            18:  */
        !            19:
        !            20: #define DDB_DEBUG
        !            21:
        !            22: #include <sys/param.h>
        !            23: #include <sys/systm.h>
        !            24:
        !            25: #include <machine/db_machdep.h>
        !            26: #include <machine/frame.h>
        !            27:
        !            28: #include <ddb/db_access.h>
        !            29: #include <ddb/db_command.h>
        !            30: #include <ddb/db_output.h>
        !            31: #include <ddb/db_run.h>
        !            32: #include <ddb/db_sym.h>
        !            33: #include <ddb/db_var.h>
        !            34: #include <ddb/db_variables.h>
        !            35: #include <ddb/db_extern.h>
        !            36: #include <ddb/db_interface.h>
        !            37:
        !            38: #include <dev/cons.h>
        !            39:
        !            40: void kdbprinttrap(int, int);
        !            41:
        !            42: extern char *trap_type[];
        !            43: extern int trap_types;
        !            44:
        !            45: db_regs_t      ddb_regs;
        !            46: struct db_variable db_regs[] = {
        !            47:        { "flags", (long *)&ddb_regs.tf_flags,  FCN_NULL },
        !            48:        { "r1",    (long *)&ddb_regs.tf_r1,  FCN_NULL },
        !            49:        { "rp",    (long *)&ddb_regs.tf_rp,  FCN_NULL },
        !            50:        { "r3",    (long *)&ddb_regs.tf_r3,  FCN_NULL },
        !            51:        { "r4",    (long *)&ddb_regs.tf_r4,  FCN_NULL },
        !            52:        { "r5",    (long *)&ddb_regs.tf_r5,  FCN_NULL },
        !            53:        { "r6",    (long *)&ddb_regs.tf_r6,  FCN_NULL },
        !            54:        { "r7",    (long *)&ddb_regs.tf_r7,  FCN_NULL },
        !            55:        { "r8",    (long *)&ddb_regs.tf_r8,  FCN_NULL },
        !            56:        { "r9",    (long *)&ddb_regs.tf_r9,  FCN_NULL },
        !            57:        { "r10",   (long *)&ddb_regs.tf_r10, FCN_NULL },
        !            58:        { "r11",   (long *)&ddb_regs.tf_r11, FCN_NULL },
        !            59:        { "r12",   (long *)&ddb_regs.tf_r12, FCN_NULL },
        !            60:        { "r13",   (long *)&ddb_regs.tf_r13, FCN_NULL },
        !            61:        { "r14",   (long *)&ddb_regs.tf_r14, FCN_NULL },
        !            62:        { "r15",   (long *)&ddb_regs.tf_r15, FCN_NULL },
        !            63:        { "r16",   (long *)&ddb_regs.tf_r16, FCN_NULL },
        !            64:        { "r17",   (long *)&ddb_regs.tf_r17, FCN_NULL },
        !            65:        { "r18",   (long *)&ddb_regs.tf_r18, FCN_NULL },
        !            66:        { "r19",   (long *)&ddb_regs.tf_args[7], FCN_NULL },
        !            67:        { "r20",   (long *)&ddb_regs.tf_args[6], FCN_NULL },
        !            68:        { "r21",   (long *)&ddb_regs.tf_args[5], FCN_NULL },
        !            69:        { "r22",   (long *)&ddb_regs.tf_args[4], FCN_NULL },
        !            70:        { "r23",   (long *)&ddb_regs.tf_args[3], FCN_NULL },
        !            71:        { "r24",   (long *)&ddb_regs.tf_args[2], FCN_NULL },
        !            72:        { "r25",   (long *)&ddb_regs.tf_args[1], FCN_NULL },
        !            73:        { "r26",   (long *)&ddb_regs.tf_args[0], FCN_NULL },
        !            74:        { "r27",   (long *)&ddb_regs.tf_dp,   FCN_NULL },
        !            75:        { "r28",   (long *)&ddb_regs.tf_ret0, FCN_NULL },
        !            76:        { "r29",   (long *)&ddb_regs.tf_ret1, FCN_NULL },
        !            77:        { "r30",   (long *)&ddb_regs.tf_sp,   FCN_NULL },
        !            78:        { "r31",   (long *)&ddb_regs.tf_r31,  FCN_NULL },
        !            79:        { "sar",   (long *)&ddb_regs.tf_sar,  FCN_NULL },
        !            80:
        !            81:        { "rctr",  (long *)&ddb_regs.tf_rctr, FCN_NULL },
        !            82:        { "ccr",   (long *)&ddb_regs.tf_ccr,  FCN_NULL },
        !            83:        { "eirr",  (long *)&ddb_regs.tf_eirr, FCN_NULL },
        !            84:        { "eiem",  (long *)&ddb_regs.tf_eiem, FCN_NULL },
        !            85:        { "iir",   (long *)&ddb_regs.tf_iir,  FCN_NULL },
        !            86:        { "isr",   (long *)&ddb_regs.tf_isr,  FCN_NULL },
        !            87:        { "ior",   (long *)&ddb_regs.tf_ior,  FCN_NULL },
        !            88:        { "ipsw",  (long *)&ddb_regs.tf_ipsw, FCN_NULL },
        !            89:        { "iisqh", (long *)&ddb_regs.tf_iisq[0], FCN_NULL },
        !            90:        { "iioqh", (long *)&ddb_regs.tf_iioq[0], FCN_NULL },
        !            91:        { "iisqt", (long *)&ddb_regs.tf_iisq[1], FCN_NULL },
        !            92:        { "iioqt", (long *)&ddb_regs.tf_iioq[1], FCN_NULL },
        !            93:        { "ci",    (long *)&ddb_regs.tf_ci,   FCN_NULL },
        !            94:        { "vtop",  (long *)&ddb_regs.tf_vtop, FCN_NULL },
        !            95:        { "cr27",  (long *)&ddb_regs.tf_cr27, FCN_NULL },
        !            96:        { "cr30",  (long *)&ddb_regs.tf_cr30, FCN_NULL },
        !            97:
        !            98:        { "sr0",   (long *)&ddb_regs.tf_sr0,  FCN_NULL },
        !            99:        { "sr1",   (long *)&ddb_regs.tf_sr1,  FCN_NULL },
        !           100:        { "sr2",   (long *)&ddb_regs.tf_sr2,  FCN_NULL },
        !           101:        { "sr3",   (long *)&ddb_regs.tf_sr3,  FCN_NULL },
        !           102:        { "sr4",   (long *)&ddb_regs.tf_sr4,  FCN_NULL },
        !           103:        { "sr5",   (long *)&ddb_regs.tf_sr5,  FCN_NULL },
        !           104:        { "sr6",   (long *)&ddb_regs.tf_sr6,  FCN_NULL },
        !           105:        { "sr7",   (long *)&ddb_regs.tf_sr7,  FCN_NULL },
        !           106:
        !           107:        { "pidr1", (long *)&ddb_regs.tf_pidr1, FCN_NULL },
        !           108:        { "pidr2", (long *)&ddb_regs.tf_pidr2, FCN_NULL },
        !           109: };
        !           110: struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
        !           111: int db_active = 0;
        !           112:
        !           113: void
        !           114: Debugger()
        !           115: {
        !           116:        __asm __volatile ("break %0, %1"
        !           117:            :: "i" (HPPA_BREAK_KERNEL), "i" (HPPA_BREAK_KGDB));
        !           118: }
        !           119:
        !           120: void
        !           121: db_read_bytes(addr, size, data)
        !           122:        vaddr_t addr;
        !           123:        size_t size;
        !           124:        char *data;
        !           125: {
        !           126:        register char *src = (char *)addr;
        !           127:
        !           128:        while (size--)
        !           129:                *data++ = *src++;
        !           130: }
        !           131:
        !           132: void
        !           133: db_write_bytes(addr, size, data)
        !           134:        vaddr_t addr;
        !           135:        size_t size;
        !           136:        char *data;
        !           137: {
        !           138:        register char *dst = (char *)addr;
        !           139:
        !           140:        while (size--)
        !           141:                *dst++ = *data++;
        !           142:
        !           143:        /* unfortunately ddb does not provide any hooks for these */
        !           144:        ficache(HPPA_SID_KERNEL, (vaddr_t)data, size);
        !           145:        fdcache(HPPA_SID_KERNEL, (vaddr_t)data, size);
        !           146: }
        !           147:
        !           148:
        !           149: /*
        !           150:  * Print trap reason.
        !           151:  */
        !           152: void
        !           153: kdbprinttrap(type, code)
        !           154:        int type, code;
        !           155: {
        !           156:        type &= ~T_USER;        /* just in case */
        !           157:        db_printf("kernel: ");
        !           158:        if (type >= trap_types || type < 0)
        !           159:                db_printf("type 0x%x", type);
        !           160:        else
        !           161:                db_printf("%s", trap_type[type]);
        !           162:        db_printf(" trap, code=0x%x\n", code);
        !           163: }
        !           164:
        !           165: /*
        !           166:  *  kdb_trap - field a BPT trap
        !           167:  */
        !           168: int
        !           169: kdb_trap(type, code, regs)
        !           170:        int type, code;
        !           171:        db_regs_t *regs;
        !           172: {
        !           173:        extern label_t *db_recover;
        !           174:        int s;
        !           175:
        !           176:        switch (type) {
        !           177:        case T_IBREAK:
        !           178:        case T_DBREAK:
        !           179:        case -1:
        !           180:                break;
        !           181:        default:
        !           182:                if (!db_panic)
        !           183:                        return (0);
        !           184:
        !           185:                kdbprinttrap(type, code);
        !           186:                if (db_recover != 0) {
        !           187:                        db_error("Caught exception in DDB; continuing...\n");
        !           188:                        /* NOT REACHED */
        !           189:                }
        !           190:        }
        !           191:
        !           192:        /* XXX Should switch to kdb`s own stack here. */
        !           193:
        !           194:        s = splhigh();
        !           195:        bcopy(regs, &ddb_regs, sizeof(ddb_regs));
        !           196:        db_active++;
        !           197:        cnpollc(TRUE);
        !           198:        db_trap(type, code);
        !           199:        cnpollc(FALSE);
        !           200:        db_active--;
        !           201:        bcopy(&ddb_regs, regs, sizeof(*regs));
        !           202:        splx(s);
        !           203:
        !           204:        return (1);
        !           205: }
        !           206:
        !           207: /*
        !           208:  *  Validate an address for use as a breakpoint.
        !           209:  *  Any address is allowed for now.
        !           210:  */
        !           211: int
        !           212: db_valid_breakpoint(addr)
        !           213:        db_addr_t addr;
        !           214: {
        !           215:        return (1);
        !           216: }
        !           217:
        !           218: void
        !           219: db_stack_trace_print(addr, have_addr, count, modif, pr)
        !           220:        db_expr_t       addr;
        !           221:        int             have_addr;
        !           222:        db_expr_t       count;
        !           223:        char            *modif;
        !           224:        int             (*pr)(const char *, ...);
        !           225: {
        !           226:        register_t *fp, pc, rp, *argp;
        !           227:        db_sym_t sym;
        !           228:        db_expr_t off;
        !           229:        char *name;
        !           230:        char **argnp, *argnames[8];
        !           231:        int nargs;
        !           232:
        !           233:        if (count < 0)
        !           234:                count = 65536;
        !           235:
        !           236:        if (!have_addr) {
        !           237:                fp = (register_t *)ddb_regs.tf_r3;
        !           238:                pc = ddb_regs.tf_iioq[0];
        !           239:                rp = ddb_regs.tf_rp;
        !           240:        } else {
        !           241:                fp = (register_t *)addr;
        !           242:                pc = 0;
        !           243:                rp = ((register_t *)fp)[-5];
        !           244:        }
        !           245:
        !           246: #ifdef DDB_DEBUG
        !           247:        (*pr) (">> %p, 0x%lx, 0x%lx\t", fp, pc, rp);
        !           248: #endif
        !           249:        while (fp && count--) {
        !           250:
        !           251:                if (USERMODE(pc))
        !           252:                        return;
        !           253:
        !           254:                sym = db_search_symbol(pc, DB_STGY_ANY, &off);
        !           255:                db_symbol_values (sym, &name, NULL);
        !           256:
        !           257:                (*pr)("%s(", name);
        !           258:
        !           259:                /* args */
        !           260:                nargs = 8;
        !           261:                argnp = NULL;
        !           262:                if (db_sym_numargs(sym, &nargs, argnames))
        !           263:                        argnp = argnames;
        !           264:                else
        !           265:                        nargs = 4;
        !           266:                /*
        !           267:                 * XXX first eight args are passed on registers, and may not
        !           268:                 * be stored on stack, dunno how to recover their values yet
        !           269:                 */
        !           270:                for (argp = &fp[-9]; nargs--; argp--) {
        !           271:                        if (argnp)
        !           272:                                (*pr)("%s=", *argnp++);
        !           273:                        (*pr)("%x%s", db_get_value((long)argp, 8, FALSE),
        !           274:                                  nargs? ",":"");
        !           275:                }
        !           276:                (*pr)(") at ");
        !           277:                db_printsym(pc, DB_STGY_PROC, pr);
        !           278:                (*pr)("\n");
        !           279:
        !           280:                /* TODO: print locals */
        !           281:
        !           282:                /* next frame */
        !           283:                pc = rp;
        !           284:                rp = fp[-2];
        !           285:
        !           286:                /* if a terminal frame and not a start of a page
        !           287:                 * then skip the trapframe and the terminal frame */
        !           288:                if (!fp[0]) {
        !           289:                        struct trapframe *tf;
        !           290:
        !           291:                        tf = (struct trapframe *)((char *)fp - sizeof(*tf));
        !           292:
        !           293:                        if (tf->tf_flags & TFF_SYS)
        !           294:                                (*pr)("-- syscall #%d(%lx, %lx, %lx, %lx, ...)\n",
        !           295:                                    tf->tf_r1, tf->tf_args[0], tf->tf_args[1],
        !           296:                                    tf->tf_args[2], tf->tf_args[3],
        !           297:                                    tf->tf_args[4], tf->tf_args[5],
        !           298:                                    tf->tf_args[6], tf->tf_args[7]);
        !           299:                        else
        !           300:                                (*pr)("-- trap #%d%s\n", tf->tf_flags & 0x3f,
        !           301:                                    (tf->tf_flags & T_USER)? " from user" : "");
        !           302:
        !           303:                        if (!(tf->tf_flags & TFF_LAST)) {
        !           304:                                fp = (register_t *)tf->tf_r3;
        !           305:                                pc = tf->tf_iioq[0];
        !           306:                                rp = tf->tf_rp;
        !           307:                        } else
        !           308:                                fp = 0;
        !           309:                } else
        !           310:                        fp = (register_t *)fp[0];
        !           311: #ifdef DDB_DEBUG
        !           312:                (*pr) (">> %p, 0x%lx, 0x%lx\t", fp, pc, rp);
        !           313: #endif
        !           314:        }
        !           315:
        !           316:        if (count && pc) {
        !           317:                db_printsym(pc, DB_STGY_XTRN, pr);
        !           318:                (*pr)(":\n");
        !           319:        }
        !           320: }

CVSweb