PERFORCE change 122954 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Thu Jul 5 13:57:52 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=122954
Change 122954 by gonzo at gonzo_jeeves on 2007/07/05 13:57:25
o Show fields and flags of cp0 status and cause registers on
panic.
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips/trap.c#22 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips/trap.c#22 (text+ko) ====
@@ -129,6 +129,26 @@
trapsignal(td, &ksi);
}
+/*
+ * Helper routines to explain content of fields/flags for cp0 registers
+ */
+#define PRINT_VAL(val, bit, size, name) do { \
+ if(coma) \
+ printf(","); \
+ printf("%s=%x", name, \
+ (((val) >> (bit)) & ((1 << ((size)+1))-1))); \
+ coma = 1; \
+ } while(0)
+
+#define PRINT_FLAG(val, bit, name) do { \
+ if(((val) >> (bit)) & 1) { \
+ if(coma) \
+ printf(","); \
+ printf("%s", name); \
+ coma = 1; \
+ } \
+ } while(0)
+
void
trap(struct trapframe * tf, u_int cause, void *badvaddr)
{
@@ -138,6 +158,7 @@
struct trap_identifier *tid;
int code, kernelmode;
int ftype, error;
+ u_int coma = 0, status;
platform_trap_enter();
@@ -303,8 +324,40 @@
printf("program counter = %#x\n", tf->tf_regs[TF_EPC]);
printf("return address = %#x\n", tf->tf_regs[TF_RA]);
printf("bad virtual address = %p\n", badvaddr);
- printf("cause = %#x\n", cause);
- printf("status = %#x\n", tf->tf_regs[TF_SR]);
+
+ printf("cause = %#x <", cause);
+ PRINT_VAL(cause, 2, 5, "ExcCode");
+ PRINT_VAL(cause, 8, 2, "IPSW");
+ PRINT_VAL(cause, 10, 2, "IPHW");
+ PRINT_FLAG(cause, 22, "WP");
+ PRINT_FLAG(cause, 23, "IV");
+ PRINT_VAL(cause, 28, 2, "CE");
+ PRINT_FLAG(cause, 31, "BD");
+ printf(">\n");
+
+ coma = 0;
+ status = tf->tf_regs[TF_SR];
+ printf("status = %#x <", status);
+ PRINT_VAL(status, 28, 4, "CU");
+ PRINT_FLAG(status, 27, "RP");
+ PRINT_FLAG(status, 26, "FR");
+ PRINT_FLAG(status, 25, "RE");
+ PRINT_FLAG(status, 24, "MX");
+ PRINT_FLAG(status, 23, "PX");
+ PRINT_FLAG(status, 22, "BEV");
+ PRINT_FLAG(status, 21, "TS");
+ PRINT_FLAG(status, 20, "SR");
+ PRINT_FLAG(status, 19, "NMI");
+ PRINT_VAL(status, 8, 8, "IM");
+ PRINT_FLAG(status, 7, "KX");
+ PRINT_FLAG(status, 6, "SX");
+ PRINT_FLAG(status, 5, "UX");
+ PRINT_FLAG(status, 4, "UM");
+ PRINT_FLAG(status, 3, "RO");
+ PRINT_FLAG(status, 2, "ERL");
+ PRINT_FLAG(status, 1, "EXL");
+ PRINT_FLAG(status, 0, "IE");
+ printf(">\n");
printf("current thread = %p\n", curthread);
if (curthread != NULL) {
printf("current process = ");
@@ -339,6 +392,9 @@
platform_trap_exit();
}
+#undef PRINT_FLAG
+#undef PRINT_VAL
+
int
check_address(void *addr)
{
More information about the p4-projects
mailing list