aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Rabson <dfr@FreeBSD.org>2001-10-08 20:21:04 +0000
committerDoug Rabson <dfr@FreeBSD.org>2001-10-08 20:21:04 +0000
commita3490d55d1867a52b398a1f9838aeaa552aff9f1 (patch)
treed98d139c92a4b567830ce1863a5e23de4af9b44b
parent917efbaaba40e2678b13f191be7509a56d4c3dfd (diff)
Notes
-rw-r--r--sys/ia64/ia64/trap.c103
1 files changed, 98 insertions, 5 deletions
diff --git a/sys/ia64/ia64/trap.c b/sys/ia64/ia64/trap.c
index b0d788ea24bb..e0bf1942e4ac 100644
--- a/sys/ia64/ia64/trap.c
+++ b/sys/ia64/ia64/trap.c
@@ -146,6 +146,98 @@ static const char *ia64_vector_names[] = {
"Reserved 67", /* 67 */
};
+struct bitname {
+ u_int64_t mask;
+ const char* name;
+};
+
+static void
+printbits(u_int64_t mask, struct bitname *bn, int count)
+{
+ int i, first = 1;
+ u_int64_t bit;
+
+ for (i = 0; i < count; i++) {
+ /*
+ * Handle fields wider than one bit.
+ */
+ bit = bn[i].mask & ~(bn[i].mask - 1);
+ if (bn[i].mask > bit) {
+ if (first)
+ first = 0;
+ else
+ printf(",");
+ printf("%s=%ld", bn[i].name,
+ (mask & bn[i].mask) / bit);
+ } else if (mask & bit) {
+ if (first)
+ first = 0;
+ else
+ printf(",");
+ printf("%s", bn[i].name);
+ }
+ }
+}
+
+struct bitname psr_bits[] = {
+ {IA64_PSR_BE, "be"},
+ {IA64_PSR_UP, "up"},
+ {IA64_PSR_AC, "ac"},
+ {IA64_PSR_MFL, "mfl"},
+ {IA64_PSR_MFH, "mfh"},
+ {IA64_PSR_IC, "ic"},
+ {IA64_PSR_I, "i"},
+ {IA64_PSR_PK, "pk"},
+ {IA64_PSR_DT, "dt"},
+ {IA64_PSR_DFL, "dfl"},
+ {IA64_PSR_DFH, "dfh"},
+ {IA64_PSR_SP, "sp"},
+ {IA64_PSR_PP, "pp"},
+ {IA64_PSR_DI, "di"},
+ {IA64_PSR_SI, "si"},
+ {IA64_PSR_DB, "db"},
+ {IA64_PSR_LP, "lp"},
+ {IA64_PSR_TB, "tb"},
+ {IA64_PSR_RT, "rt"},
+ {IA64_PSR_CPL, "cpl"},
+ {IA64_PSR_IS, "is"},
+ {IA64_PSR_MC, "mc"},
+ {IA64_PSR_IT, "it"},
+ {IA64_PSR_ID, "id"},
+ {IA64_PSR_DA, "da"},
+ {IA64_PSR_DD, "dd"},
+ {IA64_PSR_SS, "ss"},
+ {IA64_PSR_RI, "ri"},
+ {IA64_PSR_ED, "ed"},
+ {IA64_PSR_BN, "bn"},
+ {IA64_PSR_IA, "ia"},
+};
+
+static void
+printpsr(u_int64_t psr)
+{
+ printbits(psr, psr_bits, sizeof(psr_bits)/sizeof(psr_bits[0]));
+}
+
+struct bitname isr_bits[] = {
+ {IA64_ISR_X, "x"},
+ {IA64_ISR_W, "w"},
+ {IA64_ISR_R, "r"},
+ {IA64_ISR_NA, "na"},
+ {IA64_ISR_SP, "sp"},
+ {IA64_ISR_RS, "rs"},
+ {IA64_ISR_IR, "ir"},
+ {IA64_ISR_NI, "ni"},
+ {IA64_ISR_SO, "so"},
+ {IA64_ISR_EI, "ei"},
+ {IA64_ISR_ED, "ed"},
+};
+
+static void printisr(u_int64_t isr)
+{
+ printbits(isr, isr_bits, sizeof(isr_bits)/sizeof(isr_bits[0]));
+}
+
static void
printtrap(int vector, int imm, struct trapframe *framep, int isfatal, int user)
{
@@ -156,8 +248,12 @@ printtrap(int vector, int imm, struct trapframe *framep, int isfatal, int user)
printf(" trap vector = 0x%x (%s)\n",
vector, ia64_vector_names[vector]);
printf(" cr.iip = 0x%lx\n", framep->tf_cr_iip);
- printf(" cr.ipsr = 0x%lx\n", framep->tf_cr_ipsr);
- printf(" cr.isr = 0x%lx\n", framep->tf_cr_isr);
+ printf(" cr.ipsr = 0x%lx (", framep->tf_cr_ipsr);
+ printpsr(framep->tf_cr_ipsr);
+ printf(")\n");
+ printf(" cr.isr = 0x%lx (", framep->tf_cr_isr);
+ printisr(framep->tf_cr_isr);
+ printf(")\n");
printf(" cr.ifa = 0x%lx\n", framep->tf_cr_ifa);
printf(" cr.iim = 0x%x\n", imm);
printf(" curthread = %p\n", curthread);
@@ -387,9 +483,6 @@ trap(int vector, int imm, struct trapframe *framep)
ucode = va;
i = SIGSEGV;
-#ifdef DEBUG
- printtrap(vector, imm, framep, 1, user);
-#endif
break;
case IA64_VEC_SINGLE_STEP_TRAP: