aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2001-04-11 16:20:11 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2001-04-11 16:20:11 +0000
commit45fdf62519cd80302ce4e9b00f68c0f8151d5824 (patch)
tree462a586e310a2e840c53fc10c5245c4949e9d9ca
parent5e4c98b1a645afee87a926dd79b86e3917a2d58e (diff)
Notes
-rw-r--r--sys/alpha/alpha/trap.c116
1 files changed, 109 insertions, 7 deletions
diff --git a/sys/alpha/alpha/trap.c b/sys/alpha/alpha/trap.c
index e13cb63ec76e..dd4ee39f74b7 100644
--- a/sys/alpha/alpha/trap.c
+++ b/sys/alpha/alpha/trap.c
@@ -91,6 +91,47 @@ static void printtrap __P((const unsigned long, const unsigned long,
extern char *syscallnames[];
#endif
+static const char *arith_exceptions[] = {
+ "software completion",
+ "invalid operation",
+ "division by zero",
+ "overflow",
+ "underflow",
+ "inexact result",
+ "integer overflow",
+};
+
+static const char *instruction_faults[] = {
+ "bpt",
+ "bugchk",
+ "gentrap",
+ "FEN",
+ "opDec"
+};
+
+static const char *interrupt_types[] = {
+ "interprocessor",
+ "clock",
+ "correctable error",
+ "machine check",
+ "I/O device",
+ "performance counter"
+};
+
+static const char *mmfault_types[] = {
+ "translation not valid",
+ "access violation",
+ "fault on read",
+ "fault on execute",
+ "fault on write"
+};
+
+static const char *mmfault_causes[] = {
+ "instruction fetch",
+ "load instructon",
+ "store instruction"
+};
+
/*
* Define the code needed before returning to user mode, for
* trap and syscall.
@@ -150,6 +191,7 @@ printtrap(a0, a1, a2, entry, framep, isfatal, user)
{
char ubuf[64];
const char *entryname;
+ unsigned long i;
switch (entry) {
case ALPHA_KENTRY_INT:
@@ -180,13 +222,73 @@ printtrap(a0, a1, a2, entry, framep, isfatal, user)
printf("%s %s trap:\n", isfatal? "fatal" : "handled",
user ? "user" : "kernel");
printf("\n");
- printf(" trap entry = 0x%lx (%s)\n", entry, entryname);
- printf(" a0 = 0x%lx\n", a0);
- printf(" a1 = 0x%lx\n", a1);
- printf(" a2 = 0x%lx\n", a2);
- printf(" pc = 0x%lx\n", framep->tf_regs[FRAME_PC]);
- printf(" ra = 0x%lx\n", framep->tf_regs[FRAME_RA]);
- printf(" curproc = %p\n", curproc);
+ printf(" trap entry = 0x%lx (%s)\n", entry, entryname);
+#ifdef SMP
+ printf(" cpuid = %d\n", PCPU_GET(cpuid));
+#endif
+ switch (entry) {
+ case ALPHA_KENTRY_INT:
+ printf(" interrupt type = ");
+ if (a0 < 5) {
+ printf("%s\n", interrupt_types[a0]);
+ if (a0 > 1) {
+ printf(" vector = 0x%lx\n", a1);
+ if (a0 < 3)
+ printf(" logout area = 0x%lx\n",
+ a2);
+ }
+ } else
+ printf("0x%lx (unknown)\n", a0);
+ break;
+ case ALPHA_KENTRY_ARITH:
+ printf(" exception type = ");
+ for (i = 0; i < 7; i++)
+ if (a0 & (1 << i)) {
+ printf("%s", arith_exceptions[i]);
+ if (a0 & (~0 - (1 << i)))
+ printf(", ");
+ }
+ printf("\n");
+ printf(" register mask = 0x%lx", a1);
+ break;
+ case ALPHA_KENTRY_MM:
+ printf(" faulting va = 0x%lx\n", a0);
+ printf(" type = ");
+ if (a1 < 5)
+ printf("%s\n", mmfault_types[a1]);
+ else
+ printf("0x%lx (unknown)\n", a1);
+ printf(" cause = ");
+ i = a2 + 1;
+ if (i < 3)
+ printf("%s\n", mmfault_causes[i]);
+ else
+ printf("0x%lx (unknown)\n", a2);
+ break;
+ case ALPHA_KENTRY_IF:
+ printf(" fault type = ");
+ if (a0 < 5)
+ printf("%s\n", instruction_faults[a0]);
+ else
+ printf("0x%lx (unknown)\n", a0);
+ break;
+ case ALPHA_KENTRY_UNA:
+ printf(" faulting va = 0x%lx\n", a0);
+ printf(" opcode = 0x%lx\n", a1);
+ printf(" register = 0x%lx\n", a2);
+ break;
+ default:
+ printf(" a0 = 0x%lx\n", a0);
+ printf(" a1 = 0x%lx\n", a1);
+ printf(" a2 = 0x%lx\n", a2);
+ break;
+ }
+ printf(" pc = 0x%lx\n", framep->tf_regs[FRAME_PC]);
+ printf(" ra = 0x%lx\n", framep->tf_regs[FRAME_RA]);
+ printf(" sp = 0x%lx\n", framep->tf_regs[FRAME_SP]);
+ if (curproc != NULL && (curproc->p_flag & P_KTHREAD) == 0)
+ printf(" usp = 0x%lx\n", alpha_pal_rdusp());
+ printf(" curproc = %p\n", curproc);
if (curproc != NULL)
printf(" pid = %d, comm = %s\n", curproc->p_pid,
curproc->p_comm);