summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/sapic.c31
-rw-r--r--sys/ia64/include/sapicvar.h3
2 files changed, 33 insertions, 1 deletions
diff --git a/sys/ia64/ia64/sapic.c b/sys/ia64/ia64/sapic.c
index e13b8d598e8d..5b478d263905 100644
--- a/sys/ia64/ia64/sapic.c
+++ b/sys/ia64/ia64/sapic.c
@@ -26,6 +26,8 @@
* $FreeBSD$
*/
+#include "opt_ddb.h"
+
#include <sys/param.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
@@ -74,7 +76,7 @@ sapic_write(struct sapic *sa, int which, u_int32_t value)
ia64_mf_a();
}
-#if 0
+#ifdef DDB
static void
sapic_read_rte(struct sapic *sa, int which,
@@ -147,5 +149,32 @@ sapic_eoi(struct sapic *sa, int vector)
vm_offset_t reg = sa->sa_registers;
*(volatile u_int32_t *) (reg + SAPIC_APIC_EOI) = vector;
+ ia64_mf();
}
+#ifdef DDB
+
+#include <ddb/ddb.h>
+
+void
+sapic_print(struct sapic *sa, int input)
+{
+ struct sapic_rte rte;
+
+ sapic_read_rte(sa, input, &rte);
+ if (rte.rte_mask == 0) {
+ db_printf("%3d %d %d %s %s %s %s %s ID=%x EID=%x\n",
+ rte.rte_vector,
+ rte.rte_delivery_mode,
+ rte.rte_destination_mode,
+ rte.rte_delivery_status ? "DS" : " ",
+ rte.rte_polarity ? "low-active " : "high-active",
+ rte.rte_rirr ? "RIRR" : " ",
+ rte.rte_trigger_mode ? "level" : "edge ",
+ rte.rte_flushen ? "F" : " ",
+ rte.rte_destination_id,
+ rte.rte_destination_eid);
+ }
+}
+
+#endif
diff --git a/sys/ia64/include/sapicvar.h b/sys/ia64/include/sapicvar.h
index 8fbdf903ca79..298b4bc60cbc 100644
--- a/sys/ia64/include/sapicvar.h
+++ b/sys/ia64/include/sapicvar.h
@@ -46,5 +46,8 @@ struct sapic *sapic_create(int id, int base, u_int64_t address);
void sapic_enable(struct sapic *sa, int input, int vector,
int trigger_mode, int polarity);
void sapic_eoi(struct sapic *sa, int vector);
+#ifdef DDB
+void sapic_print(struct sapic *sa, int input);
+#endif
#endif /* ! _MACHINE_SAPICVAR_H_ */