aboutsummaryrefslogtreecommitdiff
path: root/sys/ia64
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2007-07-30 22:42:33 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2007-07-30 22:42:33 +0000
commitea5e2a02afc719956b31ee03eecc4ce6cb3132e0 (patch)
tree2009d21e923c564519c64c4b908aa828f9e534d1 /sys/ia64
parentfe1c66b9d797192cba7874f56a4d70290afa68cb (diff)
downloadsrc-ea5e2a02afc719956b31ee03eecc4ce6cb3132e0.tar.gz
src-ea5e2a02afc719956b31ee03eecc4ce6cb3132e0.zip
Add option EXCEPTION_TRACING, which enables KTR-like functionality
for processor interruptions. This is especially useful to track unexpected nested TLB faults. Approved by: re (blanket)
Notes
Notes: svn path=/head/; revision=171665
Diffstat (limited to 'sys/ia64')
-rw-r--r--sys/ia64/ia64/db_machdep.c28
-rw-r--r--sys/ia64/ia64/exception.S58
2 files changed, 85 insertions, 1 deletions
diff --git a/sys/ia64/ia64/db_machdep.c b/sys/ia64/ia64/db_machdep.c
index e713d6d3de09..b60d9d779f14 100644
--- a/sys/ia64/ia64/db_machdep.c
+++ b/sys/ia64/ia64/db_machdep.c
@@ -29,6 +29,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <opt_xtrace.h>
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/cons.h>
@@ -604,3 +606,29 @@ stack_save(struct stack *st)
* Can unw_create* sleep?
*/
}
+
+#ifdef EXCEPTION_TRACING
+
+extern long xtrace[];
+extern long *xhead;
+
+DB_COMMAND(xtrace, db_xtrace)
+{
+ long *p;
+
+ p = (*xhead == 0) ? xtrace : xhead;
+
+ db_printf("ITC\t\t IVT\t\t IIP\t\t IFA\t\t ISR\n");
+ if (*p == 0)
+ return;
+
+ do {
+ db_printf("%016lx %016lx %016lx %016lx %016lx\n", p[0], p[1],
+ p[2], p[3], p[4]);
+ p += 5;
+ if (p == (void *)&xhead)
+ p = xtrace;
+ } while (p != xhead);
+}
+
+#endif
diff --git a/sys/ia64/ia64/exception.S b/sys/ia64/ia64/exception.S
index c54495605f7d..15bb5b3b91bf 100644
--- a/sys/ia64/ia64/exception.S
+++ b/sys/ia64/ia64/exception.S
@@ -28,6 +28,8 @@
#include <machine/asm.h>
__FBSDID("$FreeBSD$");
+#include <opt_xtrace.h>
+
#include <machine/pte.h>
#include <assym.s>
@@ -38,6 +40,59 @@ __FBSDID("$FreeBSD$");
* ar.k4 = PCPU data
*/
+#ifdef EXCEPTION_TRACING
+
+ .data
+ .global xtrace, xhead
+xtrace: .space 1024*5*8
+xhead: data8 xtrace
+
+#define XTRACE(offset) \
+{ .mmi ; \
+ mov r24=ar.itc ; \
+ mov r25=cr.iip ; \
+ mov r27=offset ; \
+} ; \
+{ .mlx ; \
+ mov r28=cr.ifa ; \
+ movl r29=xhead ;; \
+} ; \
+{ .mmi ; \
+ ld8 r29=[r29] ;; \
+ st8 [r29]=r24,8 ; \
+ nop 0 ;; \
+} ; \
+{ .mmi ; \
+ st8 [r29]=r27,8 ;; \
+ mov r24=cr.isr ; \
+ add r27=8,r29 ;; \
+} ; \
+{ .mmi ; \
+ st8 [r29]=r25,16 ;; \
+ st8 [r27]=r28,16 ; \
+ mov r25=pr ;; \
+} ; \
+{ .mlx ; \
+ st8 [r29]=r24 ; \
+ movl r28=xhead ;; \
+} ; \
+{ .mii ; \
+ cmp.eq p15,p0=r27,r28 ; \
+ addl r29=1024*5*8,r0 ;; \
+(p15) sub r27=r28,r29 ;; \
+} ; \
+{ .mib ; \
+ st8 [r28]=r27 ; \
+ mov pr=r25,0x1ffff ; \
+ nop 0 ;; \
+}
+
+#else
+
+#define XTRACE(offset)
+
+#endif
+
.text
/*
@@ -606,7 +661,8 @@ END(exception_restore)
.unwabi @svr4, 'I'; \
.save rp, r0; \
.body; \
-ivt_##name:
+ivt_##name: \
+ XTRACE(offset)
#define IVT_END(name) \
.endp ivt_##name