Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Oct 2025 16:41:24 GMT
From:      "Jonathan T. Looney" <jtl@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 1c2fc62e4a96 - main - x86: Add a way to inject artificial MCA events for testing
Message-ID:  <202510071641.597GfO6t010896@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by jtl:

URL: https://cgit.FreeBSD.org/src/commit/?id=1c2fc62e4a9689961169be7836038acd5f757be1

commit 1c2fc62e4a9689961169be7836038acd5f757be1
Author:     Loic Prylli <lprylli@netflix.com>
AuthorDate: 2025-10-06 17:59:41 +0000
Commit:     Jonathan T. Looney <jtl@FreeBSD.org>
CommitDate: 2025-10-07 16:36:47 +0000

    x86: Add a way to inject artificial MCA events for testing
    
    Reviewed by:    glebius
    Sponsored by:   Netflix
    Differential Revision:  https://reviews.freebsd.org/D52942
---
 sys/x86/x86/mca.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/sys/x86/x86/mca.c b/sys/x86/x86/mca.c
index 7ee22895e0a7..4b40f343ac90 100644
--- a/sys/x86/x86/mca.c
+++ b/sys/x86/x86/mca.c
@@ -124,6 +124,17 @@ SYSCTL_INT(_hw_mca, OID_AUTO, erratum383, CTLFLAG_RDTUN,
     &workaround_erratum383, 0,
     "Is the workaround for Erratum 383 on AMD Family 10h processors enabled?");
 
+#ifdef DIAGNOSTIC
+static uint64_t fake_status;
+SYSCTL_U64(_hw_mca, OID_AUTO, fake_status, CTLFLAG_RW,
+    &fake_status, 0,
+    "Insert artificial MCA with given status (testing purpose only)");
+static int fake_bank;
+SYSCTL_INT(_hw_mca, OID_AUTO, fake_bank, CTLFLAG_RW,
+    &fake_bank, 0,
+    "Bank to use for artificial MCAs (testing purpose only)");
+#endif
+
 static STAILQ_HEAD(, mca_internal) mca_freelist;
 static int mca_freecount;
 static STAILQ_HEAD(, mca_internal) mca_records;
@@ -701,8 +712,24 @@ mca_check_status(enum scan_mode mode, uint64_t mcg_cap, int bank,
 	bool mce, recover;
 
 	status = rdmsr(mca_msr_ops.status(bank));
-	if (!(status & MC_STATUS_VAL))
+	if (!(status & MC_STATUS_VAL)) {
+#ifdef DIAGNOSTIC
+		/*
+		 * Check if we have a pending artificial event to generate.
+		 * Note that this is potentially racy with the sysctl. The
+		 * tradeoff is deemed acceptable given the test nature
+		 * of the code.
+		 */
+		if (fake_status && bank == fake_bank) {
+			status = fake_status;
+			fake_status = 0;
+		}
+		if (!(status & MC_STATUS_VAL))
+			return (0);
+#else
 		return (0);
+#endif
+	}
 
 	recover = *recoverablep;
 	mce = mca_is_mce(mcg_cap, status, &recover);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202510071641.597GfO6t010896>