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