xref: /openbsd/sys/arch/sparc64/sparc64/db_trace.c (revision e786f1bc)
1*e786f1bcSmiod /*	$OpenBSD: db_trace.c,v 1.27 2024/04/08 20:07:53 miod Exp $	*/
249a55a10Sart /*	$NetBSD: db_trace.c,v 1.23 2001/07/10 06:06:16 eeh Exp $ */
349a55a10Sart 
449a55a10Sart /*
549a55a10Sart  * Mach Operating System
649a55a10Sart  * Copyright (c) 1991,1990 Carnegie Mellon University
749a55a10Sart  * All Rights Reserved.
849a55a10Sart  *
949a55a10Sart  * Permission to use, copy, modify and distribute this software and its
1049a55a10Sart  * documentation is hereby granted, provided that both the copyright
1149a55a10Sart  * notice and this permission notice appear in all copies of the
1249a55a10Sart  * software, derivative works or modified versions, and any portions
1349a55a10Sart  * thereof, and that both notices appear in supporting documentation.
1449a55a10Sart  *
1549a55a10Sart  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
1649a55a10Sart  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
1749a55a10Sart  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
1849a55a10Sart  *
1949a55a10Sart  * Carnegie Mellon requests users of this software to return to
2049a55a10Sart  *
2149a55a10Sart  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
2249a55a10Sart  *  School of Computer Science
2349a55a10Sart  *  Carnegie Mellon University
2449a55a10Sart  *  Pittsburgh PA 15213-3890
2549a55a10Sart  *
2649a55a10Sart  * any improvements or extensions that they make and grant Carnegie the
2749a55a10Sart  * rights to redistribute these changes.
2849a55a10Sart  */
2949a55a10Sart 
3049a55a10Sart #include <sys/param.h>
3149a55a10Sart #include <sys/proc.h>
3249a55a10Sart #include <sys/systm.h>
33c59fd4deSvisa #include <sys/stacktrace.h>
3449a55a10Sart #include <sys/user.h>
3549a55a10Sart #include <machine/db_machdep.h>
3649a55a10Sart #include <machine/ctlreg.h>
3749a55a10Sart 
3849a55a10Sart #include <ddb/db_access.h>
3949a55a10Sart #include <ddb/db_sym.h>
4049a55a10Sart #include <ddb/db_interface.h>
4149a55a10Sart #include <ddb/db_output.h>
4249a55a10Sart 
43c4071fd1Smillert void db_dump_fpstate(db_expr_t, int, db_expr_t, char *);
44c4071fd1Smillert void db_dump_window(db_expr_t, int, db_expr_t, char *);
45c4071fd1Smillert void db_dump_stack(db_expr_t, int, db_expr_t, char *);
46c4071fd1Smillert void db_dump_trap(db_expr_t, int, db_expr_t, char *);
47c4071fd1Smillert void db_dump_ts(db_expr_t, int, db_expr_t, char *);
48c4071fd1Smillert void db_print_window(u_int64_t);
4949a55a10Sart 
5049a55a10Sart #define	KLOAD(x)	probeget((paddr_t)(u_long)&(x), ASI_PRIMARY, sizeof(x))
5149a55a10Sart #define ULOAD(x)	probeget((paddr_t)(u_long)&(x), ASI_AIUS, sizeof(x))
5249a55a10Sart 
5349a55a10Sart void
db_stack_trace_print(db_expr_t addr,int have_addr,db_expr_t count,char * modif,int (* pr)(const char *,...))54a4df7a86Sguenther db_stack_trace_print(db_expr_t addr, int have_addr, db_expr_t count,
55a4df7a86Sguenther     char *modif, int (*pr)(const char *, ...))
5649a55a10Sart {
5749a55a10Sart 	vaddr_t		frame;
58fed26a10Smpi 	int		kernel_only = 1;
59fed26a10Smpi 	int		trace_thread = 0;
6049a55a10Sart 	char		c, *cp = modif;
6149a55a10Sart 
6249a55a10Sart 	while ((c = *cp++) != 0) {
6349a55a10Sart 		if (c == 't')
64fed26a10Smpi 			trace_thread = 1;
6549a55a10Sart 		if (c == 'u')
66fed26a10Smpi 			kernel_only = 0;
6749a55a10Sart 	}
6849a55a10Sart 
6949a55a10Sart 	if (!have_addr)
7049a55a10Sart 		frame = (vaddr_t)DDB_TF->tf_out[6];
7149a55a10Sart 	else {
7249a55a10Sart 		if (trace_thread) {
7349a55a10Sart 			struct proc *p;
7449a55a10Sart 			struct user *u;
7549a55a10Sart 			(*pr)("trace: pid %d ", (int)addr);
7669e7eddbSmpi 			p = tfind(addr);
7749a55a10Sart 			if (p == NULL) {
7849a55a10Sart 				(*pr)("not found\n");
7949a55a10Sart 				return;
8049a55a10Sart 			}
8149a55a10Sart 			u = p->p_addr;
8249a55a10Sart 			frame = (vaddr_t)u->u_pcb.pcb_sp;
8349a55a10Sart 			(*pr)("at %p\n", frame);
8449a55a10Sart 		} else {
8576656f3bSmpi 			write_all_windows();
8676656f3bSmpi 
8719120e8fSmpi 			frame = (vaddr_t)addr - BIAS;
8849a55a10Sart 		}
8949a55a10Sart 	}
9049a55a10Sart 
91a4df7a86Sguenther 	if ((frame & 1) == 0) {
92a4df7a86Sguenther 		db_printf("WARNING: corrupt frame at %lx\n", frame);
93a4df7a86Sguenther 		return;
94a4df7a86Sguenther 	}
95a4df7a86Sguenther 
9649a55a10Sart 	while (count--) {
9749a55a10Sart 		int		i;
9849a55a10Sart 		db_expr_t	offset;
9949a55a10Sart 		char		*name;
1006d6b8a87Smpi 		vaddr_t		pc;
1011c00236eSmiod 		struct frame	*f64;
10249a55a10Sart 
10349a55a10Sart 		/*
10449a55a10Sart 		 * Switch to frame that contains arguments
10549a55a10Sart 		 */
106a4df7a86Sguenther 
1071c00236eSmiod 		f64 = (struct frame *)(frame + BIAS);
1086d6b8a87Smpi 		pc = (vaddr_t)KLOAD(f64->fr_pc);
10949a55a10Sart 
11049a55a10Sart 		frame = KLOAD(f64->fr_fp);
11149a55a10Sart 
11249a55a10Sart 		if (kernel_only) {
11349a55a10Sart 			if (pc < KERNBASE || pc >= KERNEND)
11449a55a10Sart 				break;
115a75111ecSkettenis 			if (frame < KERNBASE)
11649a55a10Sart 				break;
11749a55a10Sart 		} else {
11849a55a10Sart 			if (frame == 0 || frame == (vaddr_t)-1)
11949a55a10Sart 				break;
12049a55a10Sart 		}
12149a55a10Sart 
12249a55a10Sart 		db_find_sym_and_offset(pc, &name, &offset);
12349a55a10Sart 
12413aab2b6Sjasper 		if (name == NULL)
12513aab2b6Sjasper 			(*pr)("%lx(", pc);
12613aab2b6Sjasper 		else
12749a55a10Sart 			(*pr)("%s(", name);
12849a55a10Sart 
129a4df7a86Sguenther 		if ((frame & 1) == 0) {
130a4df7a86Sguenther 			db_printf(")\nWARNING: corrupt frame at %lx\n", frame);
131a4df7a86Sguenther 			break;
132a4df7a86Sguenther 		}
133a4df7a86Sguenther 
13449a55a10Sart 		/*
13549a55a10Sart 		 * Print %i0..%i5; hope these still reflect the
13649a55a10Sart 		 * actual arguments somewhat...
13749a55a10Sart 		 */
1381c00236eSmiod 		f64 = (struct frame *)(frame + BIAS);
13949a55a10Sart 		for (i = 0; i < 5; i++)
14049a55a10Sart 			(*pr)("%lx, ", (long)KLOAD(f64->fr_arg[i]));
14149a55a10Sart 		(*pr)("%lx) at ", (long)KLOAD(f64->fr_arg[i]));
14233ca0db6Sart 		db_printsym(pc, DB_STGY_PROC, pr);
14349a55a10Sart 		(*pr)("\n");
14449a55a10Sart 	}
14549a55a10Sart }
14649a55a10Sart 
14719120e8fSmpi void
stacktrace_save_at(struct stacktrace * st,unsigned int skip)148ecfa01e0Smpi stacktrace_save_at(struct stacktrace *st, unsigned int skip)
14919120e8fSmpi {
1501c00236eSmiod 	struct frame	*f64;
1516d6b8a87Smpi 	vaddr_t		pc;
15219120e8fSmpi 	vaddr_t		frame;
15319120e8fSmpi 
15476656f3bSmpi 	write_all_windows();
15576656f3bSmpi 
15619120e8fSmpi 	frame = (vaddr_t)__builtin_frame_address(0) - BIAS;
15719120e8fSmpi 	if ((frame & 1) == 0)
15819120e8fSmpi 		return;
15919120e8fSmpi 
16019120e8fSmpi 	st->st_count = 0;
161c59fd4deSvisa 	while (st->st_count < STACKTRACE_MAX) {
1621c00236eSmiod 		f64 = (struct frame *)(frame + BIAS);
1636d6b8a87Smpi 		pc = (vaddr_t)KLOAD(f64->fr_pc);
16419120e8fSmpi 
16519120e8fSmpi 		frame = KLOAD(f64->fr_fp);
16619120e8fSmpi 
16719120e8fSmpi 		if (pc < KERNBASE || pc >= KERNEND)
16819120e8fSmpi 			break;
16919120e8fSmpi 		if (frame < KERNBASE)
17019120e8fSmpi 			break;
17119120e8fSmpi 		if ((frame & 1) == 0)
17219120e8fSmpi 			break;
173a12c6eadSmpi 
174ecfa01e0Smpi 		if (skip == 0)
175a12c6eadSmpi 			st->st_pc[st->st_count++] = pc;
176ecfa01e0Smpi 		else
177ecfa01e0Smpi 			skip--;
17819120e8fSmpi 	}
17919120e8fSmpi }
18049a55a10Sart 
18149a55a10Sart void
stacktrace_save_utrace(struct stacktrace * st)182a28bb56fSclaudio stacktrace_save_utrace(struct stacktrace *st)
183a28bb56fSclaudio {
184a28bb56fSclaudio 	st->st_count = 0;
185a28bb56fSclaudio }
186a28bb56fSclaudio 
187a28bb56fSclaudio void
db_dump_window(db_expr_t addr,int have_addr,db_expr_t count,char * modif)188a4df7a86Sguenther db_dump_window(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
18949a55a10Sart {
19049a55a10Sart 	int i;
19149a55a10Sart 	u_int64_t frame = DDB_TF->tf_out[6];
19249a55a10Sart 
19349a55a10Sart 	/* Addr is really window number */
19449a55a10Sart 	if (!have_addr)
19549a55a10Sart 		addr = 0;
19649a55a10Sart 
19749a55a10Sart 	/* Traverse window stack */
19849a55a10Sart 	for (i = 0; i < addr && frame; i++) {
199a4df7a86Sguenther 		if ((frame & 1) == 0)
200a4df7a86Sguenther 			break;
2011c00236eSmiod 		frame = ((struct frame *)(frame + BIAS))->fr_fp;
202a4df7a86Sguenther 	}
203a4df7a86Sguenther 
204a4df7a86Sguenther 	if ((frame & 1) == 0) {
205a4df7a86Sguenther 		db_printf("WARNING: corrupt frame at %llx\n", frame);
206a4df7a86Sguenther 		return;
20749a55a10Sart 	}
20849a55a10Sart 
20949a55a10Sart 	db_printf("Window %lx ", addr);
21049a55a10Sart 	db_print_window(frame);
21149a55a10Sart }
21249a55a10Sart 
21349a55a10Sart void
db_print_window(u_int64_t frame)214a4df7a86Sguenther db_print_window(u_int64_t frame)
21549a55a10Sart {
2161c00236eSmiod 	struct frame *f = (struct frame *)(frame + BIAS);
21749a55a10Sart 
2181c00236eSmiod 	db_printf("frame %p locals, ins:\n", f);
21949a55a10Sart 	db_printf("%llx %llx %llx %llx ",
22049a55a10Sart 		  (unsigned long long)f->fr_local[0],
22149a55a10Sart 		  (unsigned long long)f->fr_local[1],
22249a55a10Sart 		  (unsigned long long)f->fr_local[2],
22349a55a10Sart 		  (unsigned long long)f->fr_local[3]);
22449a55a10Sart 	db_printf("%llx %llx %llx %llx\n",
22549a55a10Sart 		  (unsigned long long)f->fr_local[4],
22649a55a10Sart 		  (unsigned long long)f->fr_local[5],
22749a55a10Sart 		  (unsigned long long)f->fr_local[6],
22849a55a10Sart 		  (unsigned long long)f->fr_local[7]);
22949a55a10Sart 	db_printf("%llx %llx %llx %llx ",
23049a55a10Sart 		  (unsigned long long)f->fr_arg[0],
23149a55a10Sart 		  (unsigned long long)f->fr_arg[1],
23249a55a10Sart 		  (unsigned long long)f->fr_arg[2],
23349a55a10Sart 		  (unsigned long long)f->fr_arg[3]);
23449a55a10Sart 	db_printf("%llx %llx %llx=sp %llx=pc:",
23549a55a10Sart 		  (unsigned long long)f->fr_arg[4],
23649a55a10Sart 		  (unsigned long long)f->fr_arg[5],
23749a55a10Sart 		  (unsigned long long)f->fr_fp,
23849a55a10Sart 		  (unsigned long long)f->fr_pc);
23949a55a10Sart 	/* Sometimes this don't work.  Dunno why. */
24033ca0db6Sart 	db_printsym(f->fr_pc, DB_STGY_PROC, db_printf);
24149a55a10Sart 	db_printf("\n");
24249a55a10Sart }
24349a55a10Sart 
24449a55a10Sart void
db_dump_stack(db_expr_t addr,int have_addr,db_expr_t count,char * modif)245a4df7a86Sguenther db_dump_stack(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
24649a55a10Sart {
24749a55a10Sart 	int		i;
24849a55a10Sart 	u_int64_t	frame, oldframe;
24949a55a10Sart 
25049a55a10Sart 	if (count == -1)
25149a55a10Sart 		count = 65535;
25249a55a10Sart 
25349a55a10Sart 	if (!have_addr)
25449a55a10Sart 		frame = DDB_TF->tf_out[6];
25549a55a10Sart 	else
25649a55a10Sart 		frame = addr;
25749a55a10Sart 
25849a55a10Sart 	/* Traverse window stack */
25949a55a10Sart 	oldframe = 0;
26049a55a10Sart 	for (i = 0; i < count && frame; i++) {
26149a55a10Sart 		if (oldframe == frame) {
262a4df7a86Sguenther 			db_printf("WARNING: stack loop at %llx\n", frame);
26349a55a10Sart 			break;
26449a55a10Sart 		}
26549a55a10Sart 		oldframe = frame;
266a4df7a86Sguenther 
267a4df7a86Sguenther 		if ((frame & 1) == 0) {
268a4df7a86Sguenther 			db_printf("WARNING: corrupt stack at %llx\n", frame);
269a4df7a86Sguenther 			break;
270a4df7a86Sguenther 		}
271a4df7a86Sguenther 
27249a55a10Sart 		frame += BIAS;
27349a55a10Sart 		db_printf("Window %x ", i);
27449a55a10Sart 		db_print_window(frame - BIAS);
2751c00236eSmiod 		frame = ((struct frame *)frame)->fr_fp;
27649a55a10Sart 	}
27749a55a10Sart }
27849a55a10Sart 
27949a55a10Sart 
28049a55a10Sart void
db_dump_trap(db_expr_t addr,int have_addr,db_expr_t count,char * modif)281a4df7a86Sguenther db_dump_trap(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
28249a55a10Sart {
2831c00236eSmiod 	struct trapframe *tf;
28449a55a10Sart 
28549a55a10Sart 	/* Use our last trapframe? */
28649a55a10Sart 	tf = &ddb_regs.ddb_tf;
28749a55a10Sart 	{
28849a55a10Sart 		/* Or the user trapframe? */
28949a55a10Sart 		register char c, *cp = modif;
29049a55a10Sart 		while ((c = *cp++) != 0)
29149a55a10Sart 			if (c == 'u')
29249a55a10Sart 				tf = curproc->p_md.md_tf;
29349a55a10Sart 	}
29449a55a10Sart 	/* Or an arbitrary trapframe */
29549a55a10Sart 	if (have_addr)
2961c00236eSmiod 		tf = (struct trapframe *)addr;
29749a55a10Sart 
29849a55a10Sart 	db_printf("Trapframe %p:\ttstate: %llx\tpc: %llx\tnpc: %llx\n",
29949a55a10Sart 		  tf, (unsigned long long)tf->tf_tstate,
30049a55a10Sart 		  (unsigned long long)tf->tf_pc,
30149a55a10Sart 		  (unsigned long long)tf->tf_npc);
302*e786f1bcSmiod 	db_printf("y: %x\tpil: %d\toldpil: %d\ttt: %x\nGlobals:\n",
30349a55a10Sart 		  (int)tf->tf_y, (int)tf->tf_pil, (int)tf->tf_oldpil,
304*e786f1bcSmiod 		  (int)tf->tf_tt);
30549a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\n",
30649a55a10Sart 		  (unsigned long long)tf->tf_global[0],
30749a55a10Sart 		  (unsigned long long)tf->tf_global[1],
30849a55a10Sart 		  (unsigned long long)tf->tf_global[2],
30949a55a10Sart 		  (unsigned long long)tf->tf_global[3]);
31049a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\nouts:\n",
31149a55a10Sart 		  (unsigned long long)tf->tf_global[4],
31249a55a10Sart 		  (unsigned long long)tf->tf_global[5],
31349a55a10Sart 		  (unsigned long long)tf->tf_global[6],
31449a55a10Sart 		  (unsigned long long)tf->tf_global[7]);
31549a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\n",
31649a55a10Sart 		  (unsigned long long)tf->tf_out[0],
31749a55a10Sart 		  (unsigned long long)tf->tf_out[1],
31849a55a10Sart 		  (unsigned long long)tf->tf_out[2],
31949a55a10Sart 		  (unsigned long long)tf->tf_out[3]);
32049a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\nlocals:\n",
32149a55a10Sart 		  (unsigned long long)tf->tf_out[4],
32249a55a10Sart 		  (unsigned long long)tf->tf_out[5],
32349a55a10Sart 		  (unsigned long long)tf->tf_out[6],
32449a55a10Sart 		  (unsigned long long)tf->tf_out[7]);
32549a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\n",
32649a55a10Sart 		  (unsigned long long)tf->tf_local[0],
32749a55a10Sart 		  (unsigned long long)tf->tf_local[1],
32849a55a10Sart 		  (unsigned long long)tf->tf_local[2],
32949a55a10Sart 		  (unsigned long long)tf->tf_local[3]);
33049a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\nins:\n",
33149a55a10Sart 		  (unsigned long long)tf->tf_local[4],
33249a55a10Sart 		  (unsigned long long)tf->tf_local[5],
33349a55a10Sart 		  (unsigned long long)tf->tf_local[6],
33449a55a10Sart 		  (unsigned long long)tf->tf_local[7]);
33549a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\n",
33649a55a10Sart 		  (unsigned long long)tf->tf_in[0],
33749a55a10Sart 		  (unsigned long long)tf->tf_in[1],
33849a55a10Sart 		  (unsigned long long)tf->tf_in[2],
33949a55a10Sart 		  (unsigned long long)tf->tf_in[3]);
34049a55a10Sart 	db_printf("%016llx %016llx %016llx %016llx\n",
34149a55a10Sart 		  (unsigned long long)tf->tf_in[4],
34249a55a10Sart 		  (unsigned long long)tf->tf_in[5],
34349a55a10Sart 		  (unsigned long long)tf->tf_in[6],
34449a55a10Sart 		  (unsigned long long)tf->tf_in[7]);
34549a55a10Sart }
34649a55a10Sart 
34749a55a10Sart void
db_dump_fpstate(db_expr_t addr,int have_addr,db_expr_t count,char * modif)348a4df7a86Sguenther db_dump_fpstate(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
34949a55a10Sart {
3501c00236eSmiod 	struct fpstate *fpstate;
35149a55a10Sart 
35249a55a10Sart 	/* Use our last trapframe? */
35349a55a10Sart 	fpstate = &ddb_regs.ddb_fpstate;
35449a55a10Sart 	/* Or an arbitrary trapframe */
35549a55a10Sart 	if (have_addr)
3561c00236eSmiod 		fpstate = (struct fpstate *)addr;
35749a55a10Sart 
35849a55a10Sart 	db_printf("fpstate %p: fsr = %llx gsr = %lx\nfpregs:\n",
35949a55a10Sart 		fpstate, (unsigned long long)fpstate->fs_fsr,
36049a55a10Sart 		(unsigned long)fpstate->fs_gsr);
36149a55a10Sart 	db_printf(" 0: %08x %08x %08x %08x %08x %08x %08x %08x\n",
36249a55a10Sart 		(unsigned int)fpstate->fs_regs[0],
36349a55a10Sart 		(unsigned int)fpstate->fs_regs[1],
36449a55a10Sart 		(unsigned int)fpstate->fs_regs[2],
36549a55a10Sart 		(unsigned int)fpstate->fs_regs[3],
36649a55a10Sart 		(unsigned int)fpstate->fs_regs[4],
36749a55a10Sart 		(unsigned int)fpstate->fs_regs[5],
36849a55a10Sart 		(unsigned int)fpstate->fs_regs[6],
36949a55a10Sart 		(unsigned int)fpstate->fs_regs[7]);
37049a55a10Sart 	db_printf(" 8: %08x %08x %08x %08x %08x %08x %08x %08x\n",
37149a55a10Sart 		(unsigned int)fpstate->fs_regs[8],
37249a55a10Sart 		(unsigned int)fpstate->fs_regs[9],
37349a55a10Sart 		(unsigned int)fpstate->fs_regs[10],
37449a55a10Sart 		(unsigned int)fpstate->fs_regs[11],
37549a55a10Sart 		(unsigned int)fpstate->fs_regs[12],
37649a55a10Sart 		(unsigned int)fpstate->fs_regs[13],
37749a55a10Sart 		(unsigned int)fpstate->fs_regs[14],
37849a55a10Sart 		(unsigned int)fpstate->fs_regs[15]);
37949a55a10Sart 	db_printf("16: %08x %08x %08x %08x %08x %08x %08x %08x\n",
38049a55a10Sart 		(unsigned int)fpstate->fs_regs[16],
38149a55a10Sart 		(unsigned int)fpstate->fs_regs[17],
38249a55a10Sart 		(unsigned int)fpstate->fs_regs[18],
38349a55a10Sart 		(unsigned int)fpstate->fs_regs[19],
38449a55a10Sart 		(unsigned int)fpstate->fs_regs[20],
38549a55a10Sart 		(unsigned int)fpstate->fs_regs[21],
38649a55a10Sart 		(unsigned int)fpstate->fs_regs[22],
38749a55a10Sart 		(unsigned int)fpstate->fs_regs[23]);
38849a55a10Sart 	db_printf("24: %08x %08x %08x %08x %08x %08x %08x %08x\n",
38949a55a10Sart 		(unsigned int)fpstate->fs_regs[24],
39049a55a10Sart 		(unsigned int)fpstate->fs_regs[25],
39149a55a10Sart 		(unsigned int)fpstate->fs_regs[26],
39249a55a10Sart 		(unsigned int)fpstate->fs_regs[27],
39349a55a10Sart 		(unsigned int)fpstate->fs_regs[28],
39449a55a10Sart 		(unsigned int)fpstate->fs_regs[29],
39549a55a10Sart 		(unsigned int)fpstate->fs_regs[30],
39649a55a10Sart 		(unsigned int)fpstate->fs_regs[31]);
39749a55a10Sart 	db_printf("32: %08x%08x %08x%08x %08x%08x %08x%08x\n",
39849a55a10Sart 		(unsigned int)fpstate->fs_regs[32],
39949a55a10Sart 		(unsigned int)fpstate->fs_regs[33],
40049a55a10Sart 		(unsigned int)fpstate->fs_regs[34],
40149a55a10Sart 		(unsigned int)fpstate->fs_regs[35],
40249a55a10Sart 		(unsigned int)fpstate->fs_regs[36],
40349a55a10Sart 		(unsigned int)fpstate->fs_regs[37],
40449a55a10Sart 		(unsigned int)fpstate->fs_regs[38],
40549a55a10Sart 		(unsigned int)fpstate->fs_regs[39]);
40649a55a10Sart 	db_printf("40: %08x%08x %08x%08x %08x%08x %08x%08x\n",
40749a55a10Sart 		(unsigned int)fpstate->fs_regs[40],
40849a55a10Sart 		(unsigned int)fpstate->fs_regs[41],
40949a55a10Sart 		(unsigned int)fpstate->fs_regs[42],
41049a55a10Sart 		(unsigned int)fpstate->fs_regs[43],
41149a55a10Sart 		(unsigned int)fpstate->fs_regs[44],
41249a55a10Sart 		(unsigned int)fpstate->fs_regs[45],
41349a55a10Sart 		(unsigned int)fpstate->fs_regs[46],
41449a55a10Sart 		(unsigned int)fpstate->fs_regs[47]);
41549a55a10Sart 	db_printf("48: %08x%08x %08x%08x %08x%08x %08x%08x\n",
41649a55a10Sart 		(unsigned int)fpstate->fs_regs[48],
41749a55a10Sart 		(unsigned int)fpstate->fs_regs[49],
41849a55a10Sart 		(unsigned int)fpstate->fs_regs[50],
41949a55a10Sart 		(unsigned int)fpstate->fs_regs[51],
42049a55a10Sart 		(unsigned int)fpstate->fs_regs[52],
42149a55a10Sart 		(unsigned int)fpstate->fs_regs[53],
42249a55a10Sart 		(unsigned int)fpstate->fs_regs[54],
42349a55a10Sart 		(unsigned int)fpstate->fs_regs[55]);
42449a55a10Sart 	db_printf("56: %08x%08x %08x%08x %08x%08x %08x%08x\n",
42549a55a10Sart 		(unsigned int)fpstate->fs_regs[56],
42649a55a10Sart 		(unsigned int)fpstate->fs_regs[57],
42749a55a10Sart 		(unsigned int)fpstate->fs_regs[58],
42849a55a10Sart 		(unsigned int)fpstate->fs_regs[59],
42949a55a10Sart 		(unsigned int)fpstate->fs_regs[60],
43049a55a10Sart 		(unsigned int)fpstate->fs_regs[61],
43149a55a10Sart 		(unsigned int)fpstate->fs_regs[62],
43249a55a10Sart 		(unsigned int)fpstate->fs_regs[63]);
43349a55a10Sart }
43449a55a10Sart 
43549a55a10Sart void
db_dump_ts(db_expr_t addr,int have_addr,db_expr_t count,char * modif)436a4df7a86Sguenther db_dump_ts(db_expr_t addr, int have_addr, db_expr_t count, char *modif)
43749a55a10Sart {
43849a55a10Sart 	struct trapstate	*ts;
43949a55a10Sart 	int			i, tl;
44049a55a10Sart 
44149a55a10Sart 	/* Use our last trapframe? */
44249a55a10Sart 	ts = &ddb_regs.ddb_ts[0];
44349a55a10Sart 	tl = ddb_regs.ddb_tl;
44449a55a10Sart 	for (i = 0; i < tl; i++) {
44549a55a10Sart 		printf("%d tt=%lx tstate=%lx tpc=%p tnpc=%p\n",
44649a55a10Sart 		       i+1, (long)ts[i].tt, (u_long)ts[i].tstate,
44749a55a10Sart 		       (void *)(u_long)ts[i].tpc, (void *)(u_long)ts[i].tnpc);
44849a55a10Sart 	}
44949a55a10Sart 
45049a55a10Sart }
451