Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp5726927pxv; Wed, 21 Jul 2021 12:24:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzwUFo5AxdKDyl7HBGkUKgdtM7mp0HlhD/wuD5F5lMQci1VV0lJqOnaep/oE9iK4fDRZbtq X-Received: by 2002:a5d:88c6:: with SMTP id i6mr28501021iol.75.1626895466515; Wed, 21 Jul 2021 12:24:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626895466; cv=none; d=google.com; s=arc-20160816; b=wYqFt/LewE9B0lUxv+kjXXj1S6TTmJ1ndT6Q65lkhS3nwFmbuAxchnrJr0BaLP2op3 53MePG7GhWYRFkMg2TkvsSxcgUbo5wSoS2kqH6ed0NhDjqUhl216VrWHagxTf171laRU S6Flr2fHeHR3vHaVpH1jRrFVoN3TaF+0w+maXpme4F3aDBKSwY8ZmPrryJ0JsMRlqK8Y S/H0sHp8H1riglT5Ng4PPj/gfwcJaIfN6IDT3OUTb4LhH6qmDfLKkvRNV863/qODO+nC CBf3ecg9vD0cgRogYe3aKIm019CooGzn0riDwD5UBgqh7l3YLhg0MurKZ2z9UqBgw/oO mCrg== 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; bh=RGYYLnVs5MjoIqyjqLuU0E+bXLGYTBrK7SG/DuCyUQQ=; b=dEBXP37LjN0FW0OPAIk+JtV98bC9EOAxMBK1n64mC9LESH+WNAJ0/J8jnEbh/ZnNQz EwREbQVbWMbQT6IYAhsHx1+fugYU7BZQjpZL9M9TntwfUCHJzuWI+owS9Jo9sppDqjmw neEPyhBJqbLED4XpS07+RCtD5izerfcr2y9KE5UhqlyVxYNXCmgkZi7gv5cLzU/frz9d ZLSQ4mQhRm0nu2ZpRzdFgiMo3vm26biYpvOMQrDFYxC+eTWhBwicgVN/myhM4ubl9VwF w+39rHkfFP4cLxKs+iUGRKvvxez+IrRGmN+QUeZkLKJK/EwtOrMGhnBsW/88CWLTWAu0 GAnA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id v10si9525520ilh.117.2021.07.21.12.24.15; Wed, 21 Jul 2021 12:24:26 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=8bytes.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238629AbhGUNpj (ORCPT + 99 others); Wed, 21 Jul 2021 09:45:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53784 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239256AbhGUNkR (ORCPT ); Wed, 21 Jul 2021 09:40:17 -0400 Received: from theia.8bytes.org (8bytes.org [IPv6:2a01:238:4383:600:38bc:a715:4b6d:a889]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 60896C061575; Wed, 21 Jul 2021 07:20:54 -0700 (PDT) Received: from cap.home.8bytes.org (p4ff2b1ea.dip0.t-ipconnect.de [79.242.177.234]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by theia.8bytes.org (Postfix) with ESMTPSA id A1401A75; Wed, 21 Jul 2021 16:20:31 +0200 (CEST) From: Joerg Roedel To: x86@kernel.org, Eric Biederman Cc: kexec@lists.infradead.org, Joerg Roedel , hpa@zytor.com, Andy Lutomirski , Dave Hansen , Peter Zijlstra , Jiri Slaby , Dan Williams , Tom Lendacky , Juergen Gross , Kees Cook , David Rientjes , Cfir Cohen , Erdem Aktas , Masami Hiramatsu , Mike Stunes , Sean Christopherson , Martin Radev , Arvind Sankar , Joerg Roedel , linux-coco@lists.linux.dev, linux-kernel@vger.kernel.org, kvm@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: [PATCH 09/12] x86/sev: Use AP Jump Table blob to stop CPU Date: Wed, 21 Jul 2021 16:20:12 +0200 Message-Id: <20210721142015.1401-10-joro@8bytes.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210721142015.1401-1-joro@8bytes.org> References: <20210721142015.1401-1-joro@8bytes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joerg Roedel To support kexec under SEV-ES the APs can't be parked with HLT. Upon wakeup the AP needs to find its way to execute at the reset vector set by the new kernel and in real-mode. This is what the AP Jump Table blob provides, so stop the APs the SEV-ES way by calling the AP-reset-hold VMGEXIT from the AP Jump Table. Signed-off-by: Joerg Roedel --- arch/x86/include/asm/sev.h | 7 +++++++ arch/x86/kernel/process.c | 8 ++++++++ arch/x86/kernel/sev.c | 11 ++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index 134a7c9d91b6..cd14b6e10f12 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -81,12 +81,19 @@ static __always_inline void sev_es_nmi_complete(void) __sev_es_nmi_complete(); } extern int __init sev_es_efi_map_ghcbs(pgd_t *pgd); +void __sev_es_stop_this_cpu(void); +static __always_inline void sev_es_stop_this_cpu(void) +{ + if (static_branch_unlikely(&sev_es_enable_key)) + __sev_es_stop_this_cpu(); +} #else static inline void sev_es_ist_enter(struct pt_regs *regs) { } static inline void sev_es_ist_exit(void) { } static inline int sev_es_setup_ap_jump_table(struct real_mode_header *rmh) { return 0; } static inline void sev_es_nmi_complete(void) { } static inline int sev_es_efi_map_ghcbs(pgd_t *pgd) { return 0; } +static inline void sev_es_stop_this_cpu(void) { } #endif #endif diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 1d9463e3096b..8d9b03923baa 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c @@ -43,6 +43,7 @@ #include #include #include +#include #include "process.h" @@ -752,6 +753,13 @@ void stop_this_cpu(void *dummy) if (boot_cpu_has(X86_FEATURE_SME)) native_wbinvd(); for (;;) { + /* + * SEV-ES guests need a special stop routine to support + * kexec. Try this first, if it fails the function will + * return and native_halt() is used. + */ + sev_es_stop_this_cpu(); + /* * Use native_halt() so that memory contents don't change * (stack usage and variables) after possibly issuing the diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index 20b439986d86..bac9bb4fa54e 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -695,7 +695,6 @@ static bool __init sev_es_setup_ghcb(void) return true; } -#ifdef CONFIG_HOTPLUG_CPU void __noreturn sev_jumptable_ap_park(void) { local_irq_disable(); @@ -725,6 +724,16 @@ void __noreturn sev_jumptable_ap_park(void) } STACK_FRAME_NON_STANDARD(sev_jumptable_ap_park); +void __sev_es_stop_this_cpu(void) +{ + /* Only park in the AP Jump Table when the code has been installed */ + if (!sev_ap_jumptable_blob_installed) + return; + + sev_jumptable_ap_park(); +} + +#ifdef CONFIG_HOTPLUG_CPU static void sev_es_ap_hlt_loop(void) { struct ghcb_state state; -- 2.31.1