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