From patchwork Mon Jan 30 16:17:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Borislav Petkov X-Patchwork-Id: 50365 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2273420wrn; Mon, 30 Jan 2023 08:28:07 -0800 (PST) X-Google-Smtp-Source: AK7set8VzeWealBmFfISic99pJqxB3IPt2T9a/buMAcr5/2R+714mON6jKW2v5uqkjEZ7Ho0+ExN X-Received: by 2002:a05:6a00:18a6:b0:580:ffa0:bfcf with SMTP id x38-20020a056a0018a600b00580ffa0bfcfmr11277194pfh.6.1675096087490; Mon, 30 Jan 2023 08:28:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675096087; cv=none; d=google.com; s=arc-20160816; b=dj231gADwH4xFzUdcZb385224XutDX1tCaNrRlQsGtIuQQyjHXDxMWZMNZ1FAW36ji 2LkgFpstkq2I9dHNBrM592XLL6hXd0/NrH/lzlRaOfQC6ar5rHK8RPAuusI4LNpbFUus e3kvJbLHXz7lAAcE57dZ/mYnnnXq5RgQggoi7HoNxJiFTLMyiAx8Y7IiXL4tACKaVSEq Bn53q6dnwYi0sCl4JMyNE0E5U42ujiwYO9+k5fNuzv9NaVaa3hP3WbBKCe+V5oIEukAU d+UhnZxz2BWZbOYPpzSxayKiadJDnukAxHFj7sTL5wS1eZisvwMAmTfXfE0CMy6YC7uG p2nw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=8di1DcnjPBJs+6sR+q46scxgOm64hQ6Nc0v1gDxBPOQ=; b=kun/7YK283enaXPJ0gGLcG/HOfYVVEvpNv3x8PaXHsS/0iZlpUXr3UTv4iREpstaju 7by7s3e/+69pRH2LqtuEy6TdaSRkO6/CjOR+Ot6kBpX9j/zviF4jMhI09cqeIo2TdKtl LZOyxPIgu8N8LGE3s7TfneFqOHKO4zTzO0FJCeN7BjF44aTpmYIgiPSAxaq/zEG+/Fgy CLThZE47uQQ6Jozn1Inay5X/DiJgsxwvYyRUJ7eQajXh/Ka70Lc2fDYwzHvxjLHIn2a2 9fog1zxr3bFNU/u/p10fcUCyjQYkiODatPPm+4oqwFuo7cVq2pLgIxL623YJjs9iPu0d J3Xw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@alien8.de header.s=dkim header.b=kbOYdYxL; 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=NONE dis=NONE) header.from=alien8.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p27-20020a056a000a1b00b0058dacf97e59si14758901pfh.284.2023.01.30.08.27.55; Mon, 30 Jan 2023 08:28:07 -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=@alien8.de header.s=dkim header.b=kbOYdYxL; 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=NONE dis=NONE) header.from=alien8.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235869AbjA3QRX (ORCPT + 99 others); Mon, 30 Jan 2023 11:17:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234818AbjA3QRT (ORCPT ); Mon, 30 Jan 2023 11:17:19 -0500 Received: from mail.skyhub.de (mail.skyhub.de [IPv6:2a01:4f8:190:11c2::b:1457]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6F76176B2 for ; Mon, 30 Jan 2023 08:17:18 -0800 (PST) Received: from zn.tnic (p5de8e9fe.dip0.t-ipconnect.de [93.232.233.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.skyhub.de (SuperMail on ZX Spectrum 128k) with ESMTPSA id 0AB6D1EC0662; Mon, 30 Jan 2023 17:17:17 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=alien8.de; s=dkim; t=1675095437; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8di1DcnjPBJs+6sR+q46scxgOm64hQ6Nc0v1gDxBPOQ=; b=kbOYdYxLjuSUHcotOBWNPGUcLBj0XhcknRBh57PVD4lt4cuJ1o+eXgSuU+xjCRrRt+5rRz c12g2PGtCToU8+7JVwFv9ON0bMyvxJOq1JaZuBbVeO8dNLUQkDfAIcm8rmIM7sMuVk0+/L hPcev2GG1vnTDjiqHAvlO3F/H3Md9BY= From: Borislav Petkov To: X86 ML Cc: LKML , stable@kernel.org Subject: [PATCH 3/4] x86/microcode/AMD: Fix mixed steppings support Date: Mon, 30 Jan 2023 17:17:08 +0100 Message-Id: <20230130161709.11615-4-bp@alien8.de> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20230130161709.11615-1-bp@alien8.de> References: <20230130161709.11615-1-bp@alien8.de> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS 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 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756465554871190708?= X-GMAIL-MSGID: =?utf-8?q?1756465554871190708?= From: "Borislav Petkov (AMD)" The AMD side of the loader has always claimed to support mixed steppings. But somewhere along the way, it broke that by assuming that the cached patch blob is a single one instead of it being one per *node*. So turn it into a per-node one so that each node can stash the blob relevant for it. [ NB: Fixes tag is not really the exactly correct one but it is good enough. ] Fixes: fe055896c040 ("x86/microcode: Merge the early microcode loader") Signed-off-by: Borislav Petkov (AMD) Cc: --- arch/x86/kernel/cpu/microcode/amd.c | 34 ++++++++++++++++++----------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index b8d73f133193..ac59783e6e9f 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -55,7 +55,9 @@ struct cont_desc { }; static u32 ucode_new_rev; -static u8 amd_ucode_patch[PATCH_MAX_SIZE]; + +/* One blob per node. */ +static u8 amd_ucode_patch[MAX_NUMNODES][PATCH_MAX_SIZE]; /* * Microcode patch container file is prepended to the initrd in cpio @@ -428,7 +430,7 @@ apply_microcode_early_amd(u32 cpuid_1_eax, void *ucode, size_t size, bool save_p patch = (u8 (*)[PATCH_MAX_SIZE])__pa_nodebug(&amd_ucode_patch); #else new_rev = &ucode_new_rev; - patch = &amd_ucode_patch; + patch = &amd_ucode_patch[0]; #endif desc.cpuid_1_eax = cpuid_1_eax; @@ -580,10 +582,10 @@ int __init save_microcode_in_initrd_amd(unsigned int cpuid_1_eax) void reload_ucode_amd(unsigned int cpu) { - struct microcode_amd *mc; u32 rev, dummy __always_unused; + struct microcode_amd *mc; - mc = (struct microcode_amd *)amd_ucode_patch; + mc = (struct microcode_amd *)amd_ucode_patch[cpu_to_node(cpu)]; rdmsr(MSR_AMD64_PATCH_LEVEL, rev, dummy); @@ -851,6 +853,8 @@ static enum ucode_state __load_microcode_amd(u8 family, const u8 *data, static enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t size) { + struct cpuinfo_x86 *c; + unsigned int nid, cpu; struct ucode_patch *p; enum ucode_state ret; @@ -863,18 +867,22 @@ static enum ucode_state load_microcode_amd(u8 family, const u8 *data, size_t siz return ret; } - p = find_patch(0); - if (!p) { - return ret; - } else { - if (boot_cpu_data.microcode >= p->patch_id) - return ret; + for_each_node(nid) { + cpu = cpumask_first(cpumask_of_node(nid)); + c = &cpu_data(cpu); + + p = find_patch(cpu); + if (!p) + continue; + + if (c->microcode >= p->patch_id) + continue; ret = UCODE_NEW; - } - memset(amd_ucode_patch, 0, PATCH_MAX_SIZE); - memcpy(amd_ucode_patch, p->data, min_t(u32, p->size, PATCH_MAX_SIZE)); + memset(&amd_ucode_patch[nid], 0, PATCH_MAX_SIZE); + memcpy(&amd_ucode_patch[nid], p->data, min_t(u32, p->size, PATCH_MAX_SIZE)); + } return ret; }