| From c669f11bcad386a81ceb69fc5e1ad6cada0cc51b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 18 Nov 2023 13:32:29 -0600 |
| Subject: x86/mce/inject: Clear test status value |
| |
| From: Yazen Ghannam <yazen.ghannam@amd.com> |
| |
| [ Upstream commit 6175b407756b22e7fdc771181b7d832ebdedef5c ] |
| |
| AMD systems generally allow MCA "simulation" where MCA registers can be |
| written with valid data and the full MCA handling flow can be tested by |
| software. |
| |
| However, the platform on Scalable MCA systems, can prevent software from |
| writing data to the MCA registers. There is no architectural way to |
| determine this configuration. Therefore, the MCE injection module will |
| check for this behavior by writing and reading back a test status value. |
| This is done during module init, and the check can run on any CPU with |
| any valid MCA bank. |
| |
| If MCA_STATUS writes are ignored by the platform, then there are no side |
| effects on the hardware state. |
| |
| If the writes are not ignored, then the test status value will remain in |
| the hardware MCA_STATUS register. It is likely that the value will not |
| be overwritten by hardware or software, since the tested CPU and bank |
| are arbitrary. Therefore, the user may see a spurious, synthetic MCA |
| error reported whenever MCA is polled for this CPU. |
| |
| Clear the test value immediately after writing it. It is very unlikely |
| that a valid MCA error is logged by hardware during the test. Errors |
| that cause an #MC won't be affected. |
| |
| Fixes: 891e465a1bd8 ("x86/mce: Check whether writes to MCA_STATUS are getting ignored") |
| Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com> |
| Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> |
| Link: https://lore.kernel.org/r/20231118193248.1296798-2-yazen.ghannam@amd.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/x86/kernel/cpu/mce/inject.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/arch/x86/kernel/cpu/mce/inject.c b/arch/x86/kernel/cpu/mce/inject.c |
| index 12cf2e7ca33c..87c15ab89651 100644 |
| --- a/arch/x86/kernel/cpu/mce/inject.c |
| +++ b/arch/x86/kernel/cpu/mce/inject.c |
| @@ -747,6 +747,7 @@ static void check_hw_inj_possible(void) |
| |
| wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), status); |
| rdmsrl_safe(mca_msr_reg(bank, MCA_STATUS), &status); |
| + wrmsrl_safe(mca_msr_reg(bank, MCA_STATUS), 0); |
| |
| if (!status) { |
| hw_injection_possible = false; |
| -- |
| 2.43.0 |
| |