Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107423176
D39661.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
1 KB
Referenced Files
None
Subscribers
None
D39661.diff
View Options
diff --git a/sys/x86/include/mca.h b/sys/x86/include/mca.h
--- a/sys/x86/include/mca.h
+++ b/sys/x86/include/mca.h
@@ -48,6 +48,11 @@
#ifdef _KERNEL
+typedef void (*mca_decode_func)(void*, const struct mca_record*);
+
+int mca_register_decode_func(mca_decode_func func, void *aux);
+int mca_deregister_decode_func(mca_decode_func func);
+
void cmc_intr(void);
void mca_init(void);
void mca_intr(void);
diff --git a/sys/x86/x86/mca.c b/sys/x86/x86/mca.c
--- a/sys/x86/x86/mca.c
+++ b/sys/x86/x86/mca.c
@@ -101,6 +101,8 @@
static volatile int mca_count; /* Number of records stored. */
static int mca_banks; /* Number of per-CPU register banks. */
static int mca_maxcount = -1; /* Limit on records stored. (-1 = unlimited) */
+static mca_decode_func mca_func;
+static void *mca_decode_arg;
static SYSCTL_NODE(_hw, OID_AUTO, mca, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL,
"Machine Check Architecture");
@@ -423,6 +425,50 @@
return (0);
}
+/*
+ * Pass mca_record to a memory controller driver so that it can decode
+ * the address and possibly do some more work.
+ */
+static void
+mca_decode_record(const struct mca_record *rec)
+{
+
+ if (mca_func != NULL)
+ mca_func(mca_decode_arg, rec);
+}
+
+int
+mca_register_decode_func(mca_decode_func func, void *aux)
+{
+ int error;
+
+ if (func == NULL)
+ return (EINVAL);
+
+ error = 0;
+ mtx_lock_spin(&mca_lock);
+ if (mca_func != NULL)
+ error = EEXIST;
+
+ if (error == 0) {
+ mca_func = func;
+ mca_decode_arg = aux;
+ }
+
+ mtx_unlock_spin(&mca_lock);
+ return (error);
+}
+
+int
+mca_deregister_decode_func(mca_decode_func func)
+{
+ if (func == NULL || func != mca_func)
+ return (EINVAL);
+
+ mca_func = NULL;
+ return (0);
+}
+
/* Dump details about a single machine check. */
static void
mca_log(const struct mca_record *rec)
@@ -615,6 +661,8 @@
}
if (rec->mr_status & MC_STATUS_MISCV)
printf("MCA: Misc 0x%llx\n", (long long)rec->mr_misc);
+
+ mca_decode_record(rec);
}
static bool
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Jan 14, 11:19 PM (5 h, 44 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15802133
Default Alt Text
D39661.diff (1 KB)
Attached To
Mode
D39661: mca: Allow for passing ECC error record to memory controller driver
Attached
Detach File
Event Timeline
Log In to Comment