Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2514754imm; Thu, 7 Jun 2018 11:58:38 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKaa12ePCfvc/m4Di5KVoYL8eKRT+N0HVAvn5Hb9Kn8kNWUekEF01CtGpOGtlyDwCtwo6V7 X-Received: by 2002:a65:4081:: with SMTP id t1-v6mr2625582pgp.32.1528397917991; Thu, 07 Jun 2018 11:58:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528397917; cv=none; d=google.com; s=arc-20160816; b=ioVaW48VRkp5q28+QSQkozoDrBmU2S6/b4XFRJ4Ko4JiWEmuQ4RLHrbKAWEq3+4X5j 1PcpipBC3UI5762XTSEPDiypFtwFRKsoOtEbDW5xX3df9mSLkKb6THOU5Dd9oyZudW9W shpkbXgvS6BxFjNdGnP8+iqPqXAEFxa6K/zlcIxQvSh8ZlQrEGOymjdoTDUNVm0mJk+U FZKNxxtYWCUDflbO4qzn26Ku67kUDaaNSrbZ6QnG+kr64xfNFx8CZDcbs94jhI0dDIzE VzwMmEqprxDgjue+QjwWNd0TxJSRu7/0c8KR4V7zkwtrA1F7/RcOuhAoFUcMMfl45isq n3nA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition :arc-authentication-results; bh=80q5KeWdeW1G4NAQAavsR1sLPJoxZt17cU4WTOinfFY=; b=QSmw7bx379oxRLEcuyOrccT2wXP36OkMESeCBegFRMdXYHjFjWDD6BOig8oVWd+0mH y77XRlHipIME8A6HHkOkBbzGTtaGwIs1mrLueXyklGPpKIzqyZtNz4n7Xd2zkcKUAXwb yJINQTDiRT+gbTlzrZTODnwQZLwtOBz1o4OC1WtKJryczPb/bv2ukNVewy6wjrx4M7AF nZYnyUiDgX1YdJYi/ykg/LeLAW3M7NCCHD3d634pcbvkmnTA4IwUp7QLwVqZFOkLvkS2 xRT+Blxc47jxBiLPz94faEzMXftyHF9yhIeQIWjQYW6rQNM83Ny7+5ILebD0x9wzrPg7 NOmg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x4-v6si51217540pfm.110.2018.06.07.11.58.23; Thu, 07 Jun 2018 11:58:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934644AbeFGQNa (ORCPT + 99 others); Thu, 7 Jun 2018 12:13:30 -0400 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:39144 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932940AbeFGOI7 (ORCPT ); Thu, 7 Jun 2018 10:08:59 -0400 Received: from [148.252.241.226] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1fQvay-0005Zn-5k; Thu, 07 Jun 2018 15:08:56 +0100 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1fQvax-0002gJ-1j; Thu, 07 Jun 2018 15:08:55 +0100 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "Thomas Gleixner" , "Greg Kroah-Hartman" , "Borislav Petkov" , "Juergen Gross" , "Rolf Neugebauer" , "Boris Ostrovsky" Date: Thu, 07 Jun 2018 15:05:21 +0100 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) Subject: [PATCH 3.16 004/410] x86/microcode/AMD: Do not load when running on a hypervisor In-Reply-To: X-SA-Exim-Connect-IP: 148.252.241.226 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.57-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Borislav Petkov commit a15a753539eca8ba243d576f02e7ca9c4b7d7042 upstream. Doing so is completely void of sense for multiple reasons so prevent it. Set dis_ucode_ldr to true and thus disable the microcode loader by default to address xen pv guests which execute the AP path but not the BSP path. By having it turned off by default, the APs won't run into the loader either. Also, check CPUID(1).ECX[31] which hypervisors set. Well almost, not the xen pv one. That one gets the aforementioned "fix". Also, improve the detection method by caching the final decision whether to continue loading in dis_ucode_ldr and do it once on the BSP. The APs then simply test that value. Signed-off-by: Borislav Petkov Tested-by: Juergen Gross Tested-by: Boris Ostrovsky Acked-by: Juergen Gross Link: http://lkml.kernel.org/r/20161218164414.9649-4-bp@alien8.de Signed-off-by: Thomas Gleixner Cc: Rolf Neugebauer Signed-off-by: Greg Kroah-Hartman [bwh: Backported to 3.16: - Early microcode loader is optional, so only set dis_ucode_ldr by default if it is enabled - Adjust context, filename] Signed-off-by: Ben Hutchings --- --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c @@ -97,7 +97,7 @@ MODULE_LICENSE("GPL"); static struct microcode_ops *microcode_ops; -bool dis_ucode_ldr; +bool dis_ucode_ldr = IS_ENABLED(CONFIG_MICROCODE_EARLY); module_param(dis_ucode_ldr, bool, 0); /* --- a/arch/x86/kernel/cpu/microcode/core_early.c +++ b/arch/x86/kernel/cpu/microcode/core_early.c @@ -76,6 +76,8 @@ static int x86_family(void) static bool __init check_loader_disabled_bsp(void) { + u32 a, b, c, d; + #ifdef CONFIG_X86_32 const char *cmdline = (const char *)__pa_nodebug(boot_command_line); const char *opt = "dis_ucode_ldr"; @@ -88,8 +90,23 @@ static bool __init check_loader_disabled bool *res = &dis_ucode_ldr; #endif - if (cmdline_find_option_bool(cmdline, option)) - *res = true; + if (!have_cpuid_p()) + return *res; + + a = 1; + c = 0; + native_cpuid(&a, &b, &c, &d); + + /* + * CPUID(1).ECX[31]: reserved for hypervisor use. This is still not + * completely accurate as xen pv guests don't see that CPUID bit set but + * that's good enough as they don't land on the BSP path anyway. + */ + if (c & BIT(31)) + return *res; + + if (cmdline_find_option_bool(cmdline, option) <= 0) + *res = false; return *res; } @@ -101,9 +118,6 @@ void __init load_ucode_bsp(void) if (check_loader_disabled_bsp()) return; - if (!have_cpuid_p()) - return; - vendor = x86_vendor(); x86 = x86_family(); @@ -137,9 +151,6 @@ void load_ucode_ap(void) if (check_loader_disabled_ap()) return; - if (!have_cpuid_p()) - return; - vendor = x86_vendor(); x86 = x86_family();