Received: by 2002:a05:6358:a55:b0:ec:fcf4:3ecf with SMTP id 21csp4201826rwb; Sat, 21 Jan 2023 07:29:26 -0800 (PST) X-Google-Smtp-Source: AMrXdXtDtbqXO/a2IrTIH7KZ54rk1RxdxUQRWLT/mKtTK0xGrwqw7VeNrGtFWkFda3OO6IjK2qPn X-Received: by 2002:a17:90b:1d08:b0:226:f63b:e26 with SMTP id on8-20020a17090b1d0800b00226f63b0e26mr19881393pjb.7.1674314966654; Sat, 21 Jan 2023 07:29:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674314966; cv=none; d=google.com; s=arc-20160816; b=xvAhwxwA3M6FY+WysZnuooL6o1q/SVLOO2ncrYRq+QPfJztlb5yTcykI9gjn0d/vd8 rN+YZKDIgrIKrydq5gbPgaRA214kZTJnvL/zqnX2RfdB/1754o4Oat+c25Va8ImDRmjI 6rcO6F9W40optLlu9COOog959Fz5RCWnGlwx4j+V/GzIHS6z1NX2D0xoOsw7zvIGsfuT 0tXOPqU+1s1g3A/yfCzgCjlw+Hr8wHN8aFlik+cqarti66WxtTJsaKmz5fFShJiPzsKE jXn8UdrKTFGakQAFQM9cGiB7NmPzTcyDjP/YZS9Wx7ubiQOuEsxia5opw9Vq6Lcx6C4r ShlQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:references:in-reply-to:cc:subject :to:reply-to:sender:from:dkim-signature:dkim-signature:date; bh=tviks/J/EhGnGES0ZBsMF2sMXoCqvreJDLs4MH673yQ=; b=GRH95Bh2Qofcs/BWlrabKggSAzI93Db0AFmpe2pKDTxwlI1GXyNxDUF0W00rFBZSBc hOm+cRh5TOSRbwAkMWI4t3JnFLscDxuGSUpo1P9+FVcny3gKjqAwxystecu1hmCk8+1b 6gImVAhqbOGeRxo3SCkWlqVdKw13YtoyfKALtYDY8InPKlVvwlXGif5WPF7gUcFwipaH IHHE2nVXsvAXZtKtKTJLBlGlF8Djt0wua+Cv8DDd/iDpRwxs9juVfFMRxi6Z4FqGxR5H PXcgiEKZ8V8Usvj3QOglF5FsMRJZ2CiM9a3+97H3Turjp3h47Aw/CYFI0f4MlTGQqtap FxUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=yb1atlKB; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g1-20020a636b01000000b0049b926fa4basi46842127pgc.345.2023.01.21.07.29.18; Sat, 21 Jan 2023 07:29:26 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=yb1atlKB; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229937AbjAUOyl (ORCPT + 50 others); Sat, 21 Jan 2023 09:54:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38466 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229837AbjAUOyc (ORCPT ); Sat, 21 Jan 2023 09:54:32 -0500 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A8FC11CF51; Sat, 21 Jan 2023 06:54:30 -0800 (PST) Date: Sat, 21 Jan 2023 14:54:28 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1674312868; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tviks/J/EhGnGES0ZBsMF2sMXoCqvreJDLs4MH673yQ=; b=yb1atlKBcMl1eqSIofDTF7QRQ7q2K/wJJkYUog0XbM/nBoZDM+4K+zJ4FqUFEckxDn/8JI /aEoRRmihGc23LGTPYZjdFhlRS8axGGMkUGQJ0RvUjLLcWXffjXOXdHNX4CLoS36ZptnKN a062ED3twwc980S0sMfBzPqTOsZbZTIBrRnrMq/c42jcPyaKnRvDKdzbEs+ji63dSbTC9k frWiXIw1Jm7dHVRk3VZj4Vkn670NysPlgpdh7zgdbxeNmi7zL/3vFtVSykGAcCi5YI4SrT dIaOzV67Eyz6G1hlLy8hy6oOLMg1lV3Jy8OpYcfcjJqDhyJ0RSiubV2ygSp7xA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1674312868; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tviks/J/EhGnGES0ZBsMF2sMXoCqvreJDLs4MH673yQ=; b=TjjTK32FPOqPxbLTzU/1vK4y7g9ocPSmDtuWbtS5U5JA6x5FrBmdifSRghtRRqFXodddGi yTtGWhIxjdxsHMCQ== From: "tip-bot2 for Ashok Raj" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/microcode] x86/microcode: Check CPU capabilities after late microcode update correctly Cc: Ashok Raj , "Borislav Petkov (AMD)" , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20230109153555.4986-3-ashok.raj@intel.com> References: <20230109153555.4986-3-ashok.raj@intel.com> MIME-Version: 1.0 Message-ID: <167431286848.4906.17390634765238999200.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the x86/microcode branch of tip: Commit-ID: c0dd9245aa9e25a697181f6085692272c9ec61bc Gitweb: https://git.kernel.org/tip/c0dd9245aa9e25a697181f6085692272c9ec61bc Author: Ashok Raj AuthorDate: Mon, 09 Jan 2023 07:35:51 -08:00 Committer: Borislav Petkov (AMD) CommitterDate: Sat, 21 Jan 2023 14:53:20 +01:00 x86/microcode: Check CPU capabilities after late microcode update correctly The kernel caches each CPU's feature bits at boot in an x86_capability[] structure. However, the capabilities in the BSP's copy can be turned off as a result of certain command line parameters or configuration restrictions, for example the SGX bit. This can cause a mismatch when comparing the values before and after the microcode update. Another example is X86_FEATURE_SRBDS_CTRL which gets added only after microcode update: --- cpuid.before 2023-01-21 14:54:15.652000747 +0100 +++ cpuid.after 2023-01-21 14:54:26.632001024 +0100 @@ -10,7 +10,7 @@ CPU: 0x00000004 0x04: eax=0x00000000 ebx=0x00000000 ecx=0x00000000 edx=0x00000000 0x00000005 0x00: eax=0x00000040 ebx=0x00000040 ecx=0x00000003 edx=0x11142120 0x00000006 0x00: eax=0x000027f7 ebx=0x00000002 ecx=0x00000001 edx=0x00000000 - 0x00000007 0x00: eax=0x00000000 ebx=0x029c6fbf ecx=0x40000000 edx=0xbc002400 + 0x00000007 0x00: eax=0x00000000 ebx=0x029c6fbf ecx=0x40000000 edx=0xbc002e00 ^^^ and which proves for a gazillionth time that late loading is a bad bad idea. microcode_check() is called after an update to report any previously cached CPUID bits which might have changed due to the update. Therefore, store the cached CPU caps before the update and compare them with the CPU caps after the microcode update has succeeded. Thus, the comparison is done between the CPUID *hardware* bits before and after the upgrade instead of using the cached, possibly runtime modified values in BSP's boot_cpu_data copy. As a result, false warnings about CPUID bits changes are avoided. [ bp: - Massage. - Add SRBDS_CTRL example. - Add kernel-doc. - Incorporate forgotten review feedback from dhansen. ] Fixes: 1008c52c09dc ("x86/CPU: Add a microcode loader callback") Signed-off-by: Ashok Raj Signed-off-by: Borislav Petkov (AMD) Link: https://lore.kernel.org/r/20230109153555.4986-3-ashok.raj@intel.com --- arch/x86/include/asm/processor.h | 1 +- arch/x86/kernel/cpu/common.c | 36 +++++++++++++++++---------- arch/x86/kernel/cpu/microcode/core.c | 6 +++++- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h index f256a4d..a77dee6 100644 --- a/arch/x86/include/asm/processor.h +++ b/arch/x86/include/asm/processor.h @@ -698,6 +698,7 @@ bool xen_set_default_idle(void); void __noreturn stop_this_cpu(void *dummy); void microcode_check(struct cpuinfo_x86 *prev_info); +void store_cpu_caps(struct cpuinfo_x86 *info); enum l1tf_mitigations { L1TF_MITIGATION_OFF, diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 0f5a173..5ff73ba 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -2298,6 +2298,25 @@ void cpu_init_secondary(void) #ifdef CONFIG_MICROCODE_LATE_LOADING /** + * store_cpu_caps() - Store a snapshot of CPU capabilities + * @curr_info: Pointer where to store it + * + * Returns: None + */ +void store_cpu_caps(struct cpuinfo_x86 *curr_info) +{ + /* Reload CPUID max function as it might've changed. */ + curr_info->cpuid_level = cpuid_eax(0); + + /* Copy all capability leafs and pick up the synthetic ones. */ + memcpy(&curr_info->x86_capability, &boot_cpu_data.x86_capability, + sizeof(curr_info->x86_capability)); + + /* Get the hardware CPUID leafs */ + get_cpu_cap(curr_info); +} + +/** * microcode_check() - Check if any CPU capabilities changed after an update. * @prev_info: CPU capabilities stored before an update. * @@ -2309,22 +2328,13 @@ void cpu_init_secondary(void) */ void microcode_check(struct cpuinfo_x86 *prev_info) { - perf_check_microcode(); - - /* Reload CPUID max function as it might've changed. */ - prev_info->cpuid_level = cpuid_eax(0); + struct cpuinfo_x86 curr_info; - /* - * Copy all capability leafs to pick up the synthetic ones so that - * memcmp() below doesn't fail on that. The ones coming from CPUID will - * get overwritten in get_cpu_cap(). - */ - memcpy(&prev_info->x86_capability, &boot_cpu_data.x86_capability, - sizeof(prev_info->x86_capability)); + perf_check_microcode(); - get_cpu_cap(prev_info); + store_cpu_caps(&curr_info); - if (!memcmp(&prev_info->x86_capability, &boot_cpu_data.x86_capability, + if (!memcmp(&prev_info->x86_capability, &curr_info.x86_capability, sizeof(prev_info->x86_capability))) return; diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c index dc5dfba..8ec38c1 100644 --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c @@ -446,6 +446,12 @@ static int microcode_reload_late(void) atomic_set(&late_cpus_in, 0); atomic_set(&late_cpus_out, 0); + /* + * Take a snapshot before the microcode update in order to compare and + * check whether any bits changed after an update. + */ + store_cpu_caps(&prev_info); + ret = stop_machine_cpuslocked(__reload_late, NULL, cpu_online_mask); if (ret == 0) microcode_check(&prev_info);