Home | History | Annotate | Line # | Download | only in mips
db_trace.c revision 1.4
      1 /*	$NetBSD: db_trace.c,v 1.4 1999/01/06 04:11:31 nisimura Exp $	*/
      2 
      3 /*
      4  * Mach Operating System
      5  * Copyright (c) 1993-1987 Carnegie Mellon University
      6  * All Rights Reserved.
      7  *
      8  * Permission to use, copy, modify and distribute this software and its
      9  * documentation is hereby granted, provided that both the copyright
     10  * notice and this permission notice appear in all copies of the
     11  * software, derivative works or modified versions, and any portions
     12  * thereof, and that both notices appear in supporting documentation.
     13  *
     14  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
     15  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
     16  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
     17  *
     18  * Carnegie Mellon requests users of this software to return to
     19  *
     20  *  Software Distribution Coordinator  or  Software.Distribution (at) CS.CMU.EDU
     21  *  School of Computer Science
     22  *  Carnegie Mellon University
     23  *  Pittsburgh PA 15213-3890
     24  *
     25  * any improvements or extensions that they make and grant Carnegie Mellon
     26  * the rights to redistribute these changes.
     27  */
     28 
     29 #include <sys/types.h>
     30 #include <vm/vm_param.h>		/* XXX boolean_t */
     31 
     32 #include <machine/param.h>
     33 #include <mips/db_machdep.h>
     34 #include <ddb/db_interface.h>
     35 #include <ddb/db_output.h>
     36 #include <ddb/db_variables.h>
     37 #include <ddb/db_sym.h>
     38 
     39 extern int __start __P((void));	/* lowest kernel code address */
     40 extern vaddr_t getreg_val __P((db_expr_t regno));
     41 
     42 #define REG_ARG(i)	(4+i)
     43 #define SAVES_RA(x)	isa_spill((x),31)
     44 
     45 #define KERN_SAVE_REG_IDX(vp)	( \
     46 	((vp)->valuep >= (int *)(&((struct mips_saved_state *)0)->s0) &&    \
     47 	 (vp)->valuep <= (int *)(&((struct mips_saved_state *)0)->s7))?	    \
     48 		vp->valuep - (int *)(&((struct mips_saved_state *)0)->s0):  \
     49 	((vp)->valuep >= (int *)(&((struct mips_saved_state *)0)->sp) &&    \
     50 	 (vp)->valuep <= (int *)(&((struct mips_saved_state *)0)->ra))?	    \
     51 		((vp)->valuep-(int *)(&((struct mips_saved_state *)0)->sp)) + \
     52 		 ((int *)(&((struct mips_kernel_state *)0)->sp) - (int *)0):  \
     53 	 -1)
     54 
     55 extern	db_sym_t localsym __P((db_sym_t sym, boolean_t isreg, int *lex_level));
     56 
     57 /*
     58  * Machine register set.
     59  */
     60 struct mips_saved_state *db_cur_exc_frame = 0;
     61 
     62 /*
     63  *  forward declarations
     64  */
     65 int print_exception_frame __P((register struct mips_saved_state *fp,
     66 			       unsigned epc));
     67 
     68 /*XXX*/
     69 extern void stacktrace_subr __P((int a0, int a1, int a2, int a3,
     70 				 u_int pc, u_int sp, u_int fp, u_int ra,
     71 				 void (*)(const char*, ...)));
     72 
     73 /*
     74  * Stack trace helper.
     75  */
     76 void db_mips_stack_trace __P((int count, vaddr_t stackp,
     77     vaddr_t the_pc, vaddr_t the_ra, int flags, vaddr_t kstackp));
     78 
     79 
     80 #define DB_SETF_REGS FCN_NULL
     81 #define DBREGS_REG()
     82 
     83 struct db_variable db_regs[] = {
     84 	{ "at",	(long *)&ddb_regs.f_regs[AST],  DB_SETF_REGS },
     85 	{ "v0",	(long *)&ddb_regs.f_regs[V0],  DB_SETF_REGS },
     86 	{ "v1",	(long *)&ddb_regs.f_regs[V1],  DB_SETF_REGS },
     87 	{ "a0",	(long *)&ddb_regs.f_regs[A0],  DB_SETF_REGS },
     88 	{ "a1",	(long *)&ddb_regs.f_regs[A1],  DB_SETF_REGS },
     89 	{ "a2",	(long *)&ddb_regs.f_regs[A2],  DB_SETF_REGS },
     90 	{ "a3",	(long *)&ddb_regs.f_regs[A3],  DB_SETF_REGS },
     91 	{ "t0",	(long *)&ddb_regs.f_regs[T0],  DB_SETF_REGS },
     92 	{ "t1",	(long *)&ddb_regs.f_regs[T1],  DB_SETF_REGS },
     93 	{ "t2",	(long *)&ddb_regs.f_regs[T2],  DB_SETF_REGS },
     94 	{ "t3",	(long *)&ddb_regs.f_regs[T3],  DB_SETF_REGS },
     95 	{ "t4",	(long *)&ddb_regs.f_regs[T4],  DB_SETF_REGS },
     96 	{ "t5",	(long *)&ddb_regs.f_regs[T5],  DB_SETF_REGS },
     97 	{ "t6",	(long *)&ddb_regs.f_regs[T6],  DB_SETF_REGS },
     98 	{ "t7",	(long *)&ddb_regs.f_regs[T7],  DB_SETF_REGS },
     99 	{ "s0",	(long *)&ddb_regs.f_regs[S0],  DB_SETF_REGS },
    100 	{ "s1",	(long *)&ddb_regs.f_regs[S1],  DB_SETF_REGS },
    101 	{ "s2",	(long *)&ddb_regs.f_regs[S2],  DB_SETF_REGS },
    102 	{ "s3",	(long *)&ddb_regs.f_regs[S3],  DB_SETF_REGS },
    103 	{ "s4",	(long *)&ddb_regs.f_regs[S4],  DB_SETF_REGS },
    104 	{ "s5",	(long *)&ddb_regs.f_regs[S5],  DB_SETF_REGS },
    105 	{ "s6",	(long *)&ddb_regs.f_regs[S6],  DB_SETF_REGS },
    106 	{ "s7",	(long *)&ddb_regs.f_regs[S7],  DB_SETF_REGS },
    107 	{ "t8",	(long *)&ddb_regs.f_regs[T8],  DB_SETF_REGS },
    108 	{ "t9",	(long *)&ddb_regs.f_regs[T9],  DB_SETF_REGS },
    109 	{ "k0",	(long *)&ddb_regs.f_regs[K0],  DB_SETF_REGS },
    110 	{ "k1",	(long *)&ddb_regs.f_regs[K1],  DB_SETF_REGS },
    111 	{ "gp",	(long *)&ddb_regs.f_regs[GP],  DB_SETF_REGS },
    112 	{ "sp",	(long *)&ddb_regs.f_regs[SP],  DB_SETF_REGS },
    113 	{ "fp",	(long *)&ddb_regs.f_regs[S8],  DB_SETF_REGS },	/* frame ptr */
    114 	{ "ra",	(long *)&ddb_regs.f_regs[RA],  DB_SETF_REGS },
    115 	{ "sr",	(long *)&ddb_regs.f_regs[SR],  DB_SETF_REGS },
    116 	{ "mdlo",(long *)&ddb_regs.f_regs[MULLO],  DB_SETF_REGS },
    117 	{ "mdhi",(long *)&ddb_regs.f_regs[MULHI],  DB_SETF_REGS },
    118 	{ "bad", (long *)&ddb_regs.f_regs[BADVADDR], DB_SETF_REGS },
    119 	{ "cs",	(long *)&ddb_regs.f_regs[CAUSE],  DB_SETF_REGS },
    120 	{ "pc",	(long *)&ddb_regs.f_regs[PC],  DB_SETF_REGS },
    121 };
    122 struct db_variable *db_eregs = db_regs + sizeof(db_regs)/sizeof(db_regs[0]);
    123 
    124 
    125 
    126 void
    127 db_stack_trace_cmd(addr, have_addr, count, modif)
    128 	db_expr_t	addr;
    129 	boolean_t	have_addr;
    130 	db_expr_t	count;
    131 	char		*modif;
    132 {
    133 	stacktrace_subr(ddb_regs.f_regs[A0], ddb_regs.f_regs[A1],
    134 			ddb_regs.f_regs[A2], ddb_regs.f_regs[A3],
    135 			ddb_regs.f_regs[PC],
    136 			ddb_regs.f_regs[SP],
    137 			ddb_regs.f_regs[S8],	/* non-virtual fame pointer */
    138 			ddb_regs.f_regs[RA],
    139 			db_printf);
    140 }
    141 
    142 
    143 void
    144 db_mips_stack_trace(count, stackp, the_pc, the_ra, flags, kstackp)
    145 	int count;
    146 	vaddr_t stackp, the_pc, the_ra;
    147 	int flags;
    148 	vaddr_t kstackp;
    149 {
    150 	return;
    151 }
    152 
    153