svn commit: r209671 - in head/sys/ia64: ia64 include

Marcel Moolenaar marcel at FreeBSD.org
Sat Jul 3 20:19:21 UTC 2010


Author: marcel
Date: Sat Jul  3 20:19:20 2010
New Revision: 209671
URL: http://svn.freebsd.org/changeset/base/209671

Log:
  Allocate and setup an interrupt vector for corrected machine checks.
  For now, just print when we get the interrupt, but eventually we need
  to collect the details and provide a more useful report.

Modified:
  head/sys/ia64/ia64/mca.c
  head/sys/ia64/ia64/mp_machdep.c
  head/sys/ia64/include/mca.h

Modified: head/sys/ia64/ia64/mca.c
==============================================================================
--- head/sys/ia64/ia64/mca.c	Sat Jul  3 20:11:04 2010	(r209670)
+++ head/sys/ia64/ia64/mca.c	Sat Jul  3 20:19:20 2010	(r209671)
@@ -28,6 +28,7 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/bus.h>
 #include <sys/kernel.h>
 #include <sys/lock.h>
 #include <sys/malloc.h>
@@ -36,6 +37,7 @@
 #include <sys/uuid.h>
 #include <vm/vm.h>
 #include <vm/vm_kern.h>
+#include <machine/intr.h>
 #include <machine/mca.h>
 #include <machine/pal.h>
 #include <machine/sal.h>
@@ -72,6 +74,8 @@ SYSCTL_INT(_hw_mca, OID_AUTO, last, CTLF
 
 static struct mtx mca_sysctl_lock;
 
+static u_int mca_xiv_cmc;
+
 static int
 mca_sysctl_inject(SYSCTL_HANDLER_ARGS)
 {
@@ -227,6 +231,26 @@ ia64_mca_save_state(int type)
 	}
 }
 
+static u_int
+ia64_mca_intr(struct thread *td, u_int xiv, struct trapframe *tf)
+{
+
+	if (xiv == mca_xiv_cmc) {
+		printf("MCA: corrected machine check (CMC) interrupt\n");
+		return (0);
+	}
+
+	return (0);
+}
+
+void
+ia64_mca_init_ap(void)
+{
+
+	if (mca_xiv_cmc != 0)
+		ia64_set_cmcv(mca_xiv_cmc);
+}
+
 void
 ia64_mca_init(void)
 {
@@ -289,4 +313,14 @@ ia64_mca_init(void)
 	 */
 	for (i = 0; i < SAL_INFO_TYPES; i++)
 		ia64_mca_save_state(i);
+
+	/*
+	 * Allocate a XIV for CMC interrupts, so that we can collect and save
+	 * the corrected processor checks.
+	 */
+	mca_xiv_cmc = ia64_xiv_alloc(PI_SOFT, IA64_XIV_PLAT, ia64_mca_intr);
+	if (mca_xiv_cmc != 0)
+		ia64_set_cmcv(mca_xiv_cmc);
+	else
+		printf("MCA: CMC vector could not be allocated\n");
 }

Modified: head/sys/ia64/ia64/mp_machdep.c
==============================================================================
--- head/sys/ia64/ia64/mp_machdep.c	Sat Jul  3 20:11:04 2010	(r209670)
+++ head/sys/ia64/ia64/mp_machdep.c	Sat Jul  3 20:19:20 2010	(r209671)
@@ -163,6 +163,8 @@ ia64_store_mca_state(void* arg)
 	sched_bind(td, pc->pc_cpuid);
 	thread_unlock(td);
 
+	ia64_mca_init_ap();
+
 	/*
 	 * Get and save the CPU specific MCA records. Should we get the
 	 * MCA state for each processor, or just the CMC state?

Modified: head/sys/ia64/include/mca.h
==============================================================================
--- head/sys/ia64/include/mca.h	Sat Jul  3 20:11:04 2010	(r209670)
+++ head/sys/ia64/include/mca.h	Sat Jul  3 20:19:20 2010	(r209671)
@@ -240,6 +240,7 @@ struct mca_pcidev_reg {
 #ifdef _KERNEL
 
 void ia64_mca_init(void);
+void ia64_mca_init_ap(void);
 void ia64_mca_save_state(int);
 
 #endif /* _KERNEL */


More information about the svn-src-all mailing list