Borislav Petkov aece49
From: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Borislav Petkov aece49
Date: Mon, 4 Apr 2022 17:35:45 -0700
Borislav Petkov aece49
Subject: x86/speculation: Restore speculation related MSRs during S3 resume
Borislav Petkov aece49
Git-commit: e2a1256b17b16f9b9adf1b6fea56819e7b68e463
Borislav Petkov aece49
Patch-mainline: v5.18 or v5.18-rc2 (next release)
Borislav Petkov aece49
References: bsc#1198400
Borislav Petkov aece49
Borislav Petkov aece49
After resuming from suspend-to-RAM, the MSRs that control CPU's
Borislav Petkov aece49
speculative execution behavior are not being restored on the boot CPU.
Borislav Petkov aece49
Borislav Petkov aece49
These MSRs are used to mitigate speculative execution vulnerabilities.
Borislav Petkov aece49
Not restoring them correctly may leave the CPU vulnerable.  Secondary
Borislav Petkov aece49
CPU's MSRs are correctly being restored at S3 resume by
Borislav Petkov aece49
identify_secondary_cpu().
Borislav Petkov aece49
Borislav Petkov aece49
During S3 resume, restore these MSRs for boot CPU when restoring its
Borislav Petkov aece49
processor state.
Borislav Petkov aece49
Borislav Petkov aece49
Fixes: 772439717dbf ("x86/bugs/intel: Set proper CPU features and setup RDS")
Borislav Petkov aece49
Reported-by: Neelima Krishnan <neelima.krishnan@intel.com>
Borislav Petkov aece49
Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Borislav Petkov aece49
Tested-by: Neelima Krishnan <neelima.krishnan@intel.com>
Borislav Petkov aece49
Acked-by: Borislav Petkov <bp@suse.de>
Borislav Petkov aece49
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
Borislav Petkov aece49
Cc: stable@vger.kernel.org
Borislav Petkov aece49
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Borislav Petkov aece49
---
Borislav Petkov aece49
 arch/x86/power/cpu.c | 14 ++++++++++++++
Borislav Petkov aece49
 1 file changed, 14 insertions(+)
Borislav Petkov aece49
Borislav Petkov aece49
diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c
Borislav Petkov aece49
index eaec0cb3fe04..3822666fb73d 100644
Borislav Petkov aece49
--- a/arch/x86/power/cpu.c
Borislav Petkov aece49
+++ b/arch/x86/power/cpu.c
Borislav Petkov aece49
@@ -503,10 +503,24 @@ static int pm_cpu_check(const struct x86_cpu_id *c)
Borislav Petkov aece49
 	return ret;
Borislav Petkov aece49
 }
Borislav Petkov aece49
 
Borislav Petkov aece49
+static void pm_save_spec_msr(void)
Borislav Petkov aece49
+{
Borislav Petkov aece49
+	u32 spec_msr_id[] = {
Borislav Petkov aece49
+		MSR_IA32_SPEC_CTRL,
Borislav Petkov aece49
+		MSR_IA32_TSX_CTRL,
Borislav Petkov aece49
+		MSR_TSX_FORCE_ABORT,
Borislav Petkov aece49
+		MSR_IA32_MCU_OPT_CTRL,
Borislav Petkov aece49
+		MSR_AMD64_LS_CFG,
Borislav Petkov aece49
+	};
Borislav Petkov aece49
+
Borislav Petkov aece49
+	msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id));
Borislav Petkov aece49
+}
Borislav Petkov aece49
+
Borislav Petkov aece49
 static int pm_check_save_msr(void)
Borislav Petkov aece49
 {
Borislav Petkov aece49
 	dmi_check_system(msr_save_dmi_table);
Borislav Petkov aece49
 	pm_cpu_check(msr_save_cpu_table);
Borislav Petkov aece49
+	pm_save_spec_msr();
Borislav Petkov aece49
 
Borislav Petkov aece49
 	return 0;
Borislav Petkov aece49
 }
Borislav Petkov aece49