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