From patchwork Wed Nov 9 20:53:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038049 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12029C4332F for ; Wed, 9 Nov 2022 20:54:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231889AbiKIUyM (ORCPT ); Wed, 9 Nov 2022 15:54:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49176 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231375AbiKIUx6 (ORCPT ); Wed, 9 Nov 2022 15:53:58 -0500 Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0CE0228E26; Wed, 9 Nov 2022 12:53:58 -0800 (PST) Received: by mail-pj1-x102f.google.com with SMTP id q1-20020a17090a750100b002139ec1e999so3080828pjk.1; Wed, 09 Nov 2022 12:53:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+/uV3Yk7QEQIG4AAWZWtDVX6I1cGq9Idr+N8Gk7WSAI=; b=Y9sd73Z3OOE00lbI9KlQJl7i2qv9FOviFf/g9PfcDxAiDN9wyQY8AHIjAGUneT+JFN GCrz3LLIwgWCmuw/3GiYoUfklkb73pG/fN1bzNnT0v9kNSvvcQ5iu7mrn9Tzkd6DCdN5 Hf3/gvUCLqy4H1Owx5O5sZuWpAfDw3LUgklSeMCk75EfRBFtY/FJyygGcoRZQ29VrlnV rcLz28wJfw+qnphKkCGigX5T931uqJbyNZk6IFVXQvRfzwwYnuEshpDvLFoNNAOUfcib S6JV6RwuPSfRchru9ieI2bL6h7XC6ERETkXIE2zdy5W1zbaIaDUIy8kJzBojE6w4z5JF hPTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+/uV3Yk7QEQIG4AAWZWtDVX6I1cGq9Idr+N8Gk7WSAI=; b=xkgSbIyY8TEmc7Xd3zN/3zg1TKtFiw5ydmOXijXvFjdh33pqgMsiHfIoxayyphZtPV voAMiUiYIAEuhvX5vRerLvBdoVyMkFpmYpnMgSRtCBxGynN99Shhpd+mwll2ewN74xpG YKFg+U+zzRj5NoYL3/zkDkC6n1piSxzaLpnXwEF4pfgVmxLROaX4W51NzM+zBomZZYOo ZIXrpe03DNV1R6iEndkAGfn0IINOgl0HUob7w8Vev+k8W6+5Ch4S1nOA3ovDymZRo5ax z+93wcbVVHAeTjKI1rJ9ZrJtzroLwx8TTE1an9gOgfN41LPmMTqZiX7aq356EfXagB1a l3xQ== X-Gm-Message-State: ACrzQf23tMlkVJkDODaA6o6YoSTKuXpAOqVXDWlYBleodRDVL3ynEPud DSSEdFp+KyNPLuJ/edvdOwU= X-Google-Smtp-Source: AMsMyM7UB8YbI18ZrcbwkZZev7qw+umTXxtq2dUco8FacikPxLwPpLFlJ2a03p2LpXccrXoiqjS4qQ== X-Received: by 2002:a17:90b:3715:b0:213:2d7:3164 with SMTP id mg21-20020a17090b371500b0021302d73164mr81305132pjb.191.1668027237522; Wed, 09 Nov 2022 12:53:57 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.53.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:53:57 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 01/17] x86/boot: Check boot param's cc_blob_address for direct boot mode Date: Wed, 9 Nov 2022 15:53:36 -0500 Message-Id: <20221109205353.984745-2-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Hypervisor may pass cc blob address directly into boot param's cc blob address in the direct boot mode. Check cc blcb hdr magic first in the sev_enable() and use it as cc blob address if check successfully. Signed-off-by: Tianyu Lan --- arch/x86/boot/compressed/sev.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/arch/x86/boot/compressed/sev.c b/arch/x86/boot/compressed/sev.c index c93930d5ccbd..960968f8bf75 100644 --- a/arch/x86/boot/compressed/sev.c +++ b/arch/x86/boot/compressed/sev.c @@ -272,17 +272,24 @@ static void enforce_vmpl0(void) void sev_enable(struct boot_params *bp) { + struct cc_blob_sev_info *cc_info; unsigned int eax, ebx, ecx, edx; struct msr m; bool snp; /* - * bp->cc_blob_address should only be set by boot/compressed kernel. - * Initialize it to 0 to ensure that uninitialized values from - * buggy bootloaders aren't propagated. + * bp->cc_blob_address should only be set by boot/compressed + * kernel and hypervisor with direct boot mode. Initialize it + * to 0 after checking in order to ensure that uninitialized + * values from buggy bootloaders aren't propagated. */ - if (bp) - bp->cc_blob_address = 0; + if (bp) { + cc_info = (struct cc_blob_sev_info *)(unsigned long) + bp->cc_blob_address; + + if (cc_info->magic != CC_BLOB_SEV_HDR_MAGIC) + bp->cc_blob_address = 0; + } /* * Setup/preliminary detection of SNP. This will be sanity-checked @@ -374,6 +381,10 @@ static struct cc_blob_sev_info *find_cc_blob(struct boot_params *bp) { struct cc_blob_sev_info *cc_info; + /* Boot kernel would have passed the CC blob via boot_params. */ + if (bp->cc_blob_address) + return (struct cc_blob_sev_info *)(unsigned long)bp->cc_blob_address; + cc_info = find_cc_blob_efi(bp); if (cc_info) goto found_cc_info; @@ -416,9 +427,11 @@ bool snp_init(struct boot_params *bp) /* * Pass run-time kernel a pointer to CC info via boot_params so EFI * config table doesn't need to be searched again during early startup - * phase. + * phase. Hypervisor also may popualte cc_blob_address directyly + * in direct boot mode. */ - bp->cc_blob_address = (u32)(unsigned long)cc_info; + if (!bp->cc_blob_address) + bp->cc_blob_address = (u32)(unsigned long)cc_info; return true; } From patchwork Wed Nov 9 20:53:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038050 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F3B0C43219 for ; Wed, 9 Nov 2022 20:54:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231909AbiKIUyP (ORCPT ); Wed, 9 Nov 2022 15:54:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49102 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231823AbiKIUyA (ORCPT ); Wed, 9 Nov 2022 15:54:00 -0500 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A4D927FC2; Wed, 9 Nov 2022 12:53:59 -0800 (PST) Received: by mail-pj1-x102e.google.com with SMTP id gw22so17833812pjb.3; Wed, 09 Nov 2022 12:53:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DP2gDnxC84ZwxSYEmb2xdHigIgTSb4Jlj1QnGwsCAFw=; b=Va6CZHAg3f/zFbZo9HodKXjThGqLp0oVJDcMTRhMPuBJwMNjwGadE5rwXHrXksLyxC cX9emz/hzWrYaPGXCczxnrLfezOjGGAd+GTMErsmmxBA4SsKRNR341GEI+mWnCR8gRt8 OO0jchbExs1sZE+y0+UXDLXScY2hNTmPeu8MYmo9hinVTP4rvQGZ+ZAOXRy1cGzaHPRv XJ3XECO33Hml98f43si4sKd+PM5MlAyElu/pWMnofWnQalxxUvalah0gAQkQkK6tc161 rZLozxFvh4x7I4ogl87LkxntixMV7mHEopLXzwQgLDOBLZQZ4EjzxeH31m1T9dbSTR9t Rjhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DP2gDnxC84ZwxSYEmb2xdHigIgTSb4Jlj1QnGwsCAFw=; b=MXSh9l9QtqUX8/3rRL8xLz0LV16qk8uHvPKcIH9XjwgYDeEISEGoVtyGUIErqP1KqX 8eXXhBzPC5rAIVPnS0Ejq+KSoPK2eRaWSfFsb35gRyH8SzYMA9ic5fTm3U47ICbnwHSb DwF3l8t7hZVVvgSqazJy0ekNRT5z83Tf50PmgCJ3xrunTdGf+pEgKKEJmGARQPgPFsDT cSvJH9zekM/PXkjNfAbOS6G6T9Zl/OhS/HczyXmVzpayiTX5qql4VY98APw0x5aM2JA6 KRC93Kxn/pqWXle9+oK+vtkn9mMhaVeuIA0+PO2MVA6oLesJSL/2bzTEGDg78WnX0zz5 UTtg== X-Gm-Message-State: ACrzQf1sP523uzujMRZM3P7KPILlz5qIF6Yo6ePvc2Vle/FI/vtKtsKg 9/g2N8zEDKsDtS20YiXK5Zw= X-Google-Smtp-Source: AMsMyM7sUB0CpNbgm4hVOYLAD+obpuiacN8WK398vmEeuQrG5U1sTJQXc3T6hUE3Tp4Z6X99U2bvnQ== X-Received: by 2002:a17:90b:180e:b0:213:4abf:ed0a with SMTP id lw14-20020a17090b180e00b002134abfed0amr82250323pjb.119.1668027238814; Wed, 09 Nov 2022 12:53:58 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.53.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:53:58 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 02/17] x86/sev: Pvalidate memory gab for decompressing kernel Date: Wed, 9 Nov 2022 15:53:37 -0500 Message-Id: <20221109205353.984745-3-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Pvalidate needed pages for decompressing kernel. The E820_TYPE_RAM entry includes only validated memory. The kernel expects that the RAM entry's addr is fixed while the entry size is to be extended to cover addresses to the start of next entry. This patch increases the RAM entry size to cover all possilble memory addresses until init_size. Signed-off-by: Tianyu Lan --- arch/x86/boot/compressed/head_64.S | 8 +++ arch/x86/boot/compressed/sev.c | 84 ++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S index d33f060900d2..818edaf5d0cf 100644 --- a/arch/x86/boot/compressed/head_64.S +++ b/arch/x86/boot/compressed/head_64.S @@ -348,6 +348,14 @@ SYM_CODE_START(startup_64) cld cli +#ifdef CONFIG_AMD_MEM_ENCRYPT + /* pvalidate memory on demand if SNP is enabled. */ + pushq %rsi + movq %rsi, %rdi + call pvalidate_for_startup_64 + popq %rsi +#endif + /* Setup data segments. */ xorl %eax, %eax movl %eax, %ds diff --git a/arch/x86/boot/compressed/sev.c b/arch/x86/boot/compressed/sev.c index 960968f8bf75..3a5a1ab16095 100644 --- a/arch/x86/boot/compressed/sev.c +++ b/arch/x86/boot/compressed/sev.c @@ -12,8 +12,10 @@ */ #include "misc.h" +#include #include #include +#include #include #include #include @@ -21,6 +23,7 @@ #include #include #include +#include #include "error.h" #include "../msr.h" @@ -117,6 +120,22 @@ static enum es_result vc_read_mem(struct es_em_ctxt *ctxt, /* Include code for early handlers */ #include "../../kernel/sev-shared.c" +/* Check SEV-SNP via MSR */ +static bool sev_snp_runtime_check(void) +{ + unsigned long low, high; + u64 val; + + asm volatile("rdmsr\n" : "=a" (low), "=d" (high) : + "c" (MSR_AMD64_SEV)); + + val = (high << 32) | low; + if (val & MSR_AMD64_SEV_SNP_ENABLED) + return true; + + return false; +} + static inline bool sev_snp_enabled(void) { return sev_status & MSR_AMD64_SEV_SNP_ENABLED; @@ -456,3 +475,68 @@ void sev_prep_identity_maps(unsigned long top_level_pgt) sev_verify_cbit(top_level_pgt); } + +static void extend_e820_on_demand(struct boot_e820_entry *e820_entry, + u64 needed_ram_end) +{ + u64 end, paddr; + unsigned long eflags; + int rc; + + if (!e820_entry) + return; + + /* Validated memory must be aligned by PAGE_SIZE. */ + end = ALIGN(e820_entry->addr + e820_entry->size, PAGE_SIZE); + if (needed_ram_end > end && e820_entry->type == E820_TYPE_RAM) { + for (paddr = end; paddr < needed_ram_end; paddr += PAGE_SIZE) { + rc = pvalidate(paddr, RMP_PG_SIZE_4K, true); + if (rc) { + error("Failed to validate address.n"); + return; + } + } + e820_entry->size = needed_ram_end - e820_entry->addr; + } +} + +/* + * Explicitly pvalidate needed pages for decompressing the kernel. + * The E820_TYPE_RAM entry includes only validated memory. The kernel + * expects that the RAM entry's addr is fixed while the entry size is to be + * extended to cover addresses to the start of next entry. + * The function increases the RAM entry size to cover all possible memory + * addresses until init_size. + * For example, init_end = 0x4000000, + * [RAM: 0x0 - 0x0], M[RAM: 0x0 - 0xa0000] + * [RSVD: 0xa0000 - 0x10000] [RSVD: 0xa0000 - 0x10000] + * [ACPI: 0x10000 - 0x20000] ==> [ACPI: 0x10000 - 0x20000] + * [RSVD: 0x800000 - 0x900000] [RSVD: 0x800000 - 0x900000] + * [RAM: 0x1000000 - 0x2000000] M[RAM: 0x1000000 - 0x2001000] + * [RAM: 0x2001000 - 0x2007000] M[RAM: 0x2001000 - 0x4000000] + * Other RAM memory after init_end is pvalidated by ms_hyperv_init_platform + */ +__visible void pvalidate_for_startup_64(struct boot_params *boot_params) +{ + struct boot_e820_entry *e820_entry; + u64 init_end = + boot_params->hdr.pref_address + boot_params->hdr.init_size; + u8 i, nr_entries = boot_params->e820_entries; + u64 needed_end; + + if (!sev_snp_runtime_check()) + return; + + for (i = 0; i < nr_entries; ++i) { + /* Pvalidate memory holes in e820 RAM entries. */ + e820_entry = &boot_params->e820_table[i]; + if (i < nr_entries - 1) { + needed_end = boot_params->e820_table[i + 1].addr; + if (needed_end < e820_entry->addr) + error("e820 table is not sorted.\n"); + } else { + needed_end = init_end; + } + extend_e820_on_demand(e820_entry, needed_end); + } +} From patchwork Wed Nov 9 20:53:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038057 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12904C4332F for ; Wed, 9 Nov 2022 20:54:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232010AbiKIUyv (ORCPT ); Wed, 9 Nov 2022 15:54:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49190 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231830AbiKIUyB (ORCPT ); Wed, 9 Nov 2022 15:54:01 -0500 Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0665F21E19; Wed, 9 Nov 2022 12:54:01 -0800 (PST) Received: by mail-pl1-x62e.google.com with SMTP id c2so18202254plz.11; Wed, 09 Nov 2022 12:54:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=DTm6TpUl+FGxnM+t+ZkzqsU9392mhy5cn6Qp9D3tMP0=; b=h1+vZPkZbQ/bjL443HD0aVzrIGtccqjKO6PVha/5F0zFnMdOm1OgoEp4f+cwnqHC2j ovkS9396b3D+nPDkAN3qyxuMJHoe6LZN1zHTx63ThFbjpkHxlbrb+9a2gAl9LMWYJox6 TP2+k7Ou2tgqWNpu650zEXwrld5il4A/IlGDZqV+FB1WFfB0fz+tsLwaiiWSSBfD5T37 OrTwS40CuOS5eiFa5P0RXZm92uO/NIjYoKBI92h3FebGEw5a2eZvgi+g/K4F4vKdJ+iB tT/t9dfAjfx4RfjppAuK3PU4krHvtxL/P04L06ZP7z7ya6199sYKujR6tbirl7G0Ugrw /iHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=DTm6TpUl+FGxnM+t+ZkzqsU9392mhy5cn6Qp9D3tMP0=; b=YL9Yc4la97QG5LfbvATTC3fnSJzos2ARghJ/YBYfQCEOuuGVGwb08rat7OYuS/cJFy 9TwgTEXDSWr/qb42qK7UbELdd5WPBjuFWTHZbRNIPEOTuGgxRvS3gHYef0MwbNv0bEB2 VPy7fJuTsOH2feXBq45m70FKM0jHUJzcVfjnUMFMND7w+sKgH8uGmWj5tPl/iENGMi3C ktiYki9ST4B2mhSFYz+UiURGW9oog5DpQtRTaGJ74WiYL6JCqnX1OwRwSWeSeYjMAmx7 axa570VYqzhq1FfuTFovzgeMeXh//GsI3zPkyQAnsbg3857RUjxiAxT8asyftm4cR5xb wzew== X-Gm-Message-State: ACrzQf1YhoHmDwJaKyjtxliCT6OMZMVLPoM8aT8tFqMcKqybS19DTcjw Ow3/M36s8YQ+KnAv7sc2TeM= X-Google-Smtp-Source: AMsMyM4UC7oTJE3Y9yPIYz6NxmO599TVXb4CKkWnUYLrzNdQLA1vzS6hWhEwUskFvfQVINEGEUyaNw== X-Received: by 2002:a17:90a:6e4c:b0:213:2058:f456 with SMTP id s12-20020a17090a6e4c00b002132058f456mr64822073pjm.186.1668027240442; Wed, 09 Nov 2022 12:54:00 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.53.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:53:59 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 03/17] x86/hyperv: Add sev-snp enlightened guest specific config Date: Wed, 9 Nov 2022 15:53:38 -0500 Message-Id: <20221109205353.984745-4-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Introduce static key isolation_type_en_snp for enlightened guest check and add some specific options in ms_hyperv_init_ platform(). Signed-off-by: Tianyu Lan --- arch/x86/hyperv/ivm.c | 12 +++++++++++- arch/x86/include/asm/mshyperv.h | 2 ++ arch/x86/kernel/cpu/mshyperv.c | 29 ++++++++++++++++++++++++----- drivers/hv/hv_common.c | 7 +++++++ 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/arch/x86/hyperv/ivm.c b/arch/x86/hyperv/ivm.c index 1dbcbd9da74d..e9c30dad3419 100644 --- a/arch/x86/hyperv/ivm.c +++ b/arch/x86/hyperv/ivm.c @@ -259,10 +259,20 @@ bool hv_is_isolation_supported(void) } DEFINE_STATIC_KEY_FALSE(isolation_type_snp); +DEFINE_STATIC_KEY_FALSE(isolation_type_en_snp); + +/* + * hv_isolation_type_en_snp - Check system runs in the AMD SEV-SNP based + * isolation enlightened VM. + */ +bool hv_isolation_type_en_snp(void) +{ + return static_branch_unlikely(&isolation_type_en_snp); +} /* * hv_isolation_type_snp - Check system runs in the AMD SEV-SNP based - * isolation VM. + * isolation VM with vTOM support. */ bool hv_isolation_type_snp(void) { diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 61f0c206bff0..9b8c3f638845 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -14,6 +14,7 @@ union hv_ghcb; DECLARE_STATIC_KEY_FALSE(isolation_type_snp); +DECLARE_STATIC_KEY_FALSE(isolation_type_en_snp); typedef int (*hyperv_fill_flush_list_func)( struct hv_guest_mapping_flush_list *flush, @@ -32,6 +33,7 @@ extern u64 hv_current_partition_id; extern union hv_ghcb * __percpu *hv_ghcb_pg; +extern bool hv_isolation_type_en_snp(void); int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages); int hv_call_add_logical_proc(int node, u32 lp_index, u32 acpi_id); int hv_call_create_vp(int node, u64 partition_id, u32 vp_index, u32 flags); diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 831613959a92..2ea4f21c6172 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -273,6 +273,21 @@ static void __init ms_hyperv_init_platform(void) ms_hyperv.misc_features = cpuid_edx(HYPERV_CPUID_FEATURES); ms_hyperv.hints = cpuid_eax(HYPERV_CPUID_ENLIGHTMENT_INFO); + /* + * Add custom configuration for SEV-SNP Enlightened guest + */ + if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) { + ms_hyperv.features |= HV_ACCESS_FREQUENCY_MSRS; + ms_hyperv.misc_features |= HV_FEATURE_FREQUENCY_MSRS_AVAILABLE; + ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE; + ms_hyperv.hints |= HV_DEPRECATING_AEOI_RECOMMENDED; + ms_hyperv.hints |= HV_X64_APIC_ACCESS_RECOMMENDED; + ms_hyperv.hints |= HV_X64_CLUSTER_IPI_RECOMMENDED; + } + + pr_info("Hyper-V: enlightment features 0x%x, hints 0x%x, misc 0x%x\n", + ms_hyperv.features, ms_hyperv.hints, ms_hyperv.misc_features); + hv_max_functions_eax = cpuid_eax(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS); pr_info("Hyper-V: privilege flags low 0x%x, high 0x%x, hints 0x%x, misc 0x%x\n", @@ -328,18 +343,22 @@ static void __init ms_hyperv_init_platform(void) ms_hyperv.shared_gpa_boundary = BIT_ULL(ms_hyperv.shared_gpa_boundary_bits); - pr_info("Hyper-V: Isolation Config: Group A 0x%x, Group B 0x%x\n", - ms_hyperv.isolation_config_a, ms_hyperv.isolation_config_b); - - if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) { + if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) { + static_branch_enable(&isolation_type_en_snp); + } else if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) { static_branch_enable(&isolation_type_snp); #ifdef CONFIG_SWIOTLB swiotlb_unencrypted_base = ms_hyperv.shared_gpa_boundary; #endif } + + pr_info("Hyper-V: Isolation Config: Group A 0x%x, Group B 0x%x\n", + ms_hyperv.isolation_config_a, ms_hyperv.isolation_config_b); + /* Isolation VMs are unenlightened SEV-based VMs, thus this check: */ if (IS_ENABLED(CONFIG_AMD_MEM_ENCRYPT)) { - if (hv_get_isolation_type() != HV_ISOLATION_TYPE_NONE) + if (hv_get_isolation_type() != HV_ISOLATION_TYPE_NONE + && !cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) cc_set_vendor(CC_VENDOR_HYPERV); } } diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c index ae68298c0dca..2c6602571c47 100644 --- a/drivers/hv/hv_common.c +++ b/drivers/hv/hv_common.c @@ -268,6 +268,13 @@ bool __weak hv_isolation_type_snp(void) } EXPORT_SYMBOL_GPL(hv_isolation_type_snp); +bool __weak hv_isolation_type_en_snp(void) +{ + return false; +} +EXPORT_SYMBOL_GPL(hv_isolation_type_en_snp); + + void __weak hv_setup_vmbus_handler(void (*handler)(void)) { } From patchwork Wed Nov 9 20:53:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038058 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5FF05C433FE for ; Wed, 9 Nov 2022 20:54:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230190AbiKIUyx (ORCPT ); Wed, 9 Nov 2022 15:54:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49202 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231833AbiKIUyD (ORCPT ); Wed, 9 Nov 2022 15:54:03 -0500 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9CEBF30565; Wed, 9 Nov 2022 12:54:02 -0800 (PST) Received: by mail-pj1-x102e.google.com with SMTP id gw22so17833963pjb.3; Wed, 09 Nov 2022 12:54:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0l9afkkKeSOzI6mzq1htMqRSlzdNXqGpUKUcuz2i9ek=; b=Xf0UA0v5jga/BS1GAxSGBzwObMMxAeZc8CKxagSCalOMTcj0DBkL0Yzb/MDc6ZkYkF 7sTJRTTn29+xlFjZrgukjpqfO5XzL9tpg52MNvCr4O+6pnl632kMCi2x4hnKjj+zz5fQ LTNCzvfc+fCdOzY7hsVlorwRBuZHhUq4oZ8VVzyT8gmFQvC79fnzH2ozgFlk6Y/Q3mNA 53SHo30KwDkZz0GmbTzHFD7EaRgbIMwT3OVcCGaUTvURC1laNU/ZGG3+RBmxaFIef5eS 72K6mrujsk5ha+eR4ud7KZff73JOjbQ1girLjQnscRvXtjx8SRiN21tg4akJofUEi0ma xs2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0l9afkkKeSOzI6mzq1htMqRSlzdNXqGpUKUcuz2i9ek=; b=BZjDfB5ECpjZCj0KWddlyEAkamm7mJAlqmaZZZKdU18+ZAb8vjWojh+j0ftMQP9Ryi wIFhTA5hOWyR/ykCz3n1HxCJ8CLVqRd0zuRCfEhWUHXVseQHIbqJk/7OyupQwkczJKiF XTB29Mrd7mlqyFiLoclqTkdyqggakIHfmHorxuhOfdzZRMRO/FtaLNEbTw7F+oO7muhK b/aEDBvktfF340moofXAxqfi+diY4qhBxll1gU0vs+eSjbUR8Tw6xUbIgELT+30ctQOL n21n9Pz3oK5eeLrR+a0u37cCnn/IlfYW6/tgu+qqpncN5JG6PvAcsVdzTUZAi1ghmVHo muvw== X-Gm-Message-State: ACrzQf1EbJ7cVDHPzvJF2bd3MC7RJh+6TSw+I5cQyUPZpCB8yJIuZYU/ UcqWBifeYQ0zV9jIiVzzPV4= X-Google-Smtp-Source: AMsMyM7tRYy8c6jGKBUAElQ+uVtMfnfFLT8C5PLwWvwgaQw4hc9oKXFtDvfLkWwEfSbG40eQbHIBUg== X-Received: by 2002:a17:90a:d586:b0:213:de8f:4d6 with SMTP id v6-20020a17090ad58600b00213de8f04d6mr56087727pju.31.1668027242262; Wed, 09 Nov 2022 12:54:02 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:01 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 04/17] x86/hyperv: apic change for sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:39 -0500 Message-Id: <20221109205353.984745-5-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Hyperv sev-snp enlightened guest doesn't support x2apic and apic page read/write operation. Bypass these requests. ipi request maybe returned with timeout error code and add retry mechanism. Signed-off-by: Tianyu Lan --- arch/x86/hyperv/hv_apic.c | 79 ++++++++++++++++++++++++------- include/asm-generic/hyperv-tlfs.h | 1 + 2 files changed, 63 insertions(+), 17 deletions(-) diff --git a/arch/x86/hyperv/hv_apic.c b/arch/x86/hyperv/hv_apic.c index fb8b2c088681..214354d20833 100644 --- a/arch/x86/hyperv/hv_apic.c +++ b/arch/x86/hyperv/hv_apic.c @@ -66,9 +66,15 @@ static u32 hv_apic_read(u32 reg) rdmsr(HV_X64_MSR_TPR, reg_val, hi); (void)hi; return reg_val; - + case APIC_ID: + if (hv_isolation_type_en_snp()) + return smp_processor_id(); + fallthrough; default: - return native_apic_mem_read(reg); + if (!hv_isolation_type_en_snp()) + return native_apic_mem_read(reg); + else + return 0; } } @@ -82,7 +88,8 @@ static void hv_apic_write(u32 reg, u32 val) wrmsr(HV_X64_MSR_TPR, val, 0); break; default: - native_apic_mem_write(reg, val); + if (!hv_isolation_type_en_snp()) + native_apic_mem_write(reg, val); } } @@ -106,6 +113,7 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector, struct hv_send_ipi_ex *ipi_arg; unsigned long flags; int nr_bank = 0; + int retry = 5; u64 status = HV_STATUS_INVALID_PARAMETER; if (!(ms_hyperv.hints & HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED)) @@ -144,8 +152,10 @@ static bool __send_ipi_mask_ex(const struct cpumask *mask, int vector, ipi_arg->vp_set.format = HV_GENERIC_SET_ALL; } - status = hv_do_rep_hypercall(HVCALL_SEND_IPI_EX, 0, nr_bank, + do { + status = hv_do_rep_hypercall(HVCALL_SEND_IPI_EX, 0, nr_bank, ipi_arg, NULL); + } while (status == HV_STATUS_TIME_OUT && retry--); ipi_mask_ex_done: local_irq_restore(flags); @@ -159,6 +169,7 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector, struct hv_send_ipi ipi_arg; u64 status; unsigned int weight; + int retry = 5; trace_hyperv_send_ipi_mask(mask, vector); @@ -212,8 +223,11 @@ static bool __send_ipi_mask(const struct cpumask *mask, int vector, __set_bit(vcpu, (unsigned long *)&ipi_arg.cpu_mask); } - status = hv_do_fast_hypercall16(HVCALL_SEND_IPI, ipi_arg.vector, - ipi_arg.cpu_mask); + do { + status = hv_do_fast_hypercall16(HVCALL_SEND_IPI, ipi_arg.vector, + ipi_arg.cpu_mask); + } while (status == HV_STATUS_TIME_OUT && retry--); + return hv_result_success(status); do_ex_hypercall: @@ -224,6 +238,7 @@ static bool __send_ipi_one(int cpu, int vector) { int vp = hv_cpu_number_to_vp_number(cpu); u64 status; + int retry = 5; trace_hyperv_send_ipi_one(cpu, vector); @@ -236,26 +251,48 @@ static bool __send_ipi_one(int cpu, int vector) if (vp >= 64) return __send_ipi_mask_ex(cpumask_of(cpu), vector, false); - status = hv_do_fast_hypercall16(HVCALL_SEND_IPI, vector, BIT_ULL(vp)); + do { + status = hv_do_fast_hypercall16(HVCALL_SEND_IPI, vector, BIT_ULL(vp)); + } while (status == HV_STATUS_TIME_OUT || retry--); + return hv_result_success(status); } static void hv_send_ipi(int cpu, int vector) { - if (!__send_ipi_one(cpu, vector)) - orig_apic.send_IPI(cpu, vector); + if (!__send_ipi_one(cpu, vector)) { + if (!hv_isolation_type_en_snp()) + orig_apic.send_IPI(cpu, vector); + else + WARN_ON_ONCE(1); + } } static void hv_send_ipi_mask(const struct cpumask *mask, int vector) { - if (!__send_ipi_mask(mask, vector, false)) - orig_apic.send_IPI_mask(mask, vector); + if (!__send_ipi_mask(mask, vector, false)) { + if (!hv_isolation_type_en_snp()) + orig_apic.send_IPI_mask(mask, vector); + else + WARN_ON_ONCE(1); + } } static void hv_send_ipi_mask_allbutself(const struct cpumask *mask, int vector) { - if (!__send_ipi_mask(mask, vector, true)) - orig_apic.send_IPI_mask_allbutself(mask, vector); + unsigned int this_cpu = smp_processor_id(); + struct cpumask new_mask; + const struct cpumask *local_mask; + + cpumask_copy(&new_mask, mask); + cpumask_clear_cpu(this_cpu, &new_mask); + local_mask = &new_mask; + if (!__send_ipi_mask(local_mask, vector, true)) { + if (!hv_isolation_type_en_snp()) + orig_apic.send_IPI_mask_allbutself(mask, vector); + else + WARN_ON_ONCE(1); + } } static void hv_send_ipi_allbutself(int vector) @@ -265,14 +302,22 @@ static void hv_send_ipi_allbutself(int vector) static void hv_send_ipi_all(int vector) { - if (!__send_ipi_mask(cpu_online_mask, vector, false)) - orig_apic.send_IPI_all(vector); + if (!__send_ipi_mask(cpu_online_mask, vector, false)) { + if (!hv_isolation_type_en_snp()) + orig_apic.send_IPI_all(vector); + else + WARN_ON_ONCE(1); + } } static void hv_send_ipi_self(int vector) { - if (!__send_ipi_one(smp_processor_id(), vector)) - orig_apic.send_IPI_self(vector); + if (!__send_ipi_one(smp_processor_id(), vector)) { + if (!hv_isolation_type_en_snp()) + orig_apic.send_IPI_self(vector); + else + WARN_ON_ONCE(1); + } } void __init hv_apic_init(void) diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h index fdce7a4cfc6f..6e2a090e2649 100644 --- a/include/asm-generic/hyperv-tlfs.h +++ b/include/asm-generic/hyperv-tlfs.h @@ -208,6 +208,7 @@ enum HV_GENERIC_SET_FORMAT { #define HV_STATUS_INVALID_PORT_ID 17 #define HV_STATUS_INVALID_CONNECTION_ID 18 #define HV_STATUS_INSUFFICIENT_BUFFERS 19 +#define HV_STATUS_TIME_OUT 0x78 /* * The Hyper-V TimeRefCount register and the TSC From patchwork Wed Nov 9 20:53:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038054 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E2AADC43219 for ; Wed, 9 Nov 2022 20:54:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231990AbiKIUyk (ORCPT ); Wed, 9 Nov 2022 15:54:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231835AbiKIUyE (ORCPT ); Wed, 9 Nov 2022 15:54:04 -0500 Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 187913057C; Wed, 9 Nov 2022 12:54:04 -0800 (PST) Received: by mail-pl1-x62e.google.com with SMTP id j12so18220865plj.5; Wed, 09 Nov 2022 12:54:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1OVwfeSJzfcwy29SuQO6DhipoyIsaZzVhoPd/85YD4c=; b=FDTroFilQLGDfflzGjUgAatf0ynpsufMBvMTO2ZEAdxMmiSC4M/OK1UwnacuCWgnP3 CJrE1effp7aJLou9UGFAcDkFXptac6YRUkroDZY+SHbELy1l2SovpUw0pr+Gamiezs/N Ib3+C+2cYr5zmlIzMoHB1Wv9YE6Ls6aqHrMZbKhaF0opvt5knPpJztMZhKqt3gquZyls FCDdgY217eFfguRSoMlBGvY9bjKVlJdlcSfilsOynxvXAq3jnJzGSAxYk4SjnKA9zV4J tXFS99yzSjhTAZdBC/T6vrOMqmzuMXZC6j2sOWeE0637hlNXW90pyYwY9V/ctfCWsrzC Zl3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1OVwfeSJzfcwy29SuQO6DhipoyIsaZzVhoPd/85YD4c=; b=tYwGy5TYDjIP/dRZi57IYL2doshpnJy2rohP2dqijhKUteL03fRnvrD4v0pug8L1iZ qqd+T6i1GkQXMUnWWq8QSp2hnWaMxpLi/GJYF6A733xTns8GcxiAkUqSgBXnLbe3M0Fq UQRvlVlBAi2QZ1Pri8LGy+rY+iVjd3pyseHDyPU0KuoR1ZUkxJV8c9D2o187AoCoM+MK IQYBSM4j/4y5tjAv9tWo1vadBcdd9Wz2qIzaqrzxc4gqpEAXHuANbbaWePkywSLZSe1/ dhcz3j+2Dtc0dVZqUqxufBN/6DrGvS8aTU52qDNfkeXfBVhnpXu2HWlNGrJTUIvCm/3v e1qg== X-Gm-Message-State: ACrzQf0jbB7gcIpgLwET8wwCDrVCRK7ee0vTkrBJtbt6sPLOrsc0/s8y Da7ih/aGSr2e29L60qlgsvE= X-Google-Smtp-Source: AMsMyM51QnDjE8jacTonl20Ps/yrMWw1hYV4GJWuXRNnEuAYTMH5Cvr5nmHLalkrExw5ZbCVwEXPzA== X-Received: by 2002:a17:90b:1c82:b0:1ee:eb41:b141 with SMTP id oo2-20020a17090b1c8200b001eeeb41b141mr65824831pjb.143.1668027243570; Wed, 09 Nov 2022 12:54:03 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:03 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 05/17] x86/hyperv: Decrypt hv vp assist page in sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:40 -0500 Message-Id: <20221109205353.984745-6-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan hv vp assist page is shared between sev snp guest and hyperv. Decrypt the page when use it. Signed-off-by: Tianyu Lan --- arch/x86/hyperv/hv_init.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index 29774126e931..4600c5941957 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -30,6 +30,7 @@ #include #include #include +#include int hyperv_init_cpuhp; u64 hv_current_partition_id = ~0ull; @@ -112,6 +113,11 @@ static int hv_cpu_init(unsigned int cpu) } WARN_ON(!(*hvp)); if (*hvp) { + if (hv_isolation_type_en_snp()) { + WARN_ON_ONCE(set_memory_decrypted((unsigned long)(*hvp), 1) != 0); + memset(*hvp, 0, PAGE_SIZE); + } + msr.enable = 1; wrmsrl(HV_X64_MSR_VP_ASSIST_PAGE, msr.as_uint64); } @@ -228,6 +234,12 @@ static int hv_cpu_die(unsigned int cpu) if (hv_vp_assist_page && hv_vp_assist_page[cpu]) { union hv_vp_assist_msr_contents msr = { 0 }; + + if (hv_isolation_type_en_snp()) + WARN_ON_ONCE(set_memory_encrypted( + (unsigned long)hv_vp_assist_page[cpu], + 1) != 0); + if (hv_root_partition) { /* * For root partition the VP assist page is mapped to From patchwork Wed Nov 9 20:53:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038052 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D5F43C433FE for ; Wed, 9 Nov 2022 20:54:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231986AbiKIUy3 (ORCPT ); Wed, 9 Nov 2022 15:54:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49154 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231824AbiKIUyG (ORCPT ); Wed, 9 Nov 2022 15:54:06 -0500 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 759223057F; Wed, 9 Nov 2022 12:54:05 -0800 (PST) Received: by mail-pj1-x1031.google.com with SMTP id e7-20020a17090a77c700b00216928a3917so2985178pjs.4; Wed, 09 Nov 2022 12:54:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ZHdN7biDTMCbZsH86bq9wEVAHh9Jk5WDAS/BJmNojPQ=; b=THFm4WlORiFu6wM+hxaUB0asUX7JAnBfCvwV26HjY41bQCdT7U9yg/HffOLxdniunz RbiglkCQYedFF0t5YeN0+TBtvcokjeddtNHkLemD4h7yi1bO3Rg1tyGXwQYzM9r4mR3e YTvIrZHQmjPClcIvMfq8NyY++9diK2RcH+VjooLFNIqkegcfLs+OEdDUqSJs5gZK9VPl uJ+qapjNgBUbno+lbcSPydJfkAvKMhTuFBfMgMql/oa+rEMoOGYMngtllcxhQCjKCHV+ 6RC+MSB4wjizPRH99eBVkBeB0wMk/hcBOeJIQMNitNvky0i0RJIWOO/2KigmblrsY2zf trkg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZHdN7biDTMCbZsH86bq9wEVAHh9Jk5WDAS/BJmNojPQ=; b=o+XS3KBpn7jCHabN3SBBreVXUWAci4thawQiEBr/tiikffRvAAHUPPNRGZkSrt+pX+ wPL1OW8OtGOWIP0f6vT1NoqQ5HEit7+nmBX3NQzbU/EUEFxRaIyZ6GoY8/gTp7qcoIjY jy+/hw+i9feXwxsJiiEguDL1rdAkrBTsfpLU6Mho3auO6xrIAkIqDQFfWzZUJMp8n12q U8lvT9ckHYuxWBgskdgq90GawIj8QbTQFwQW9l8kamHkzb3M6a9/bktsdw/0yYepJ3mi TzPIMHgqfHqGdtaJteA+e8/jifVFx5/G4XtlRx8OG0eNg0iX7wjGOa9abHgH/a6uWbaB Vlhw== X-Gm-Message-State: ACrzQf1FhVP10gWkl37AahhhD1TxdYlEbh2fmgNH5IwHc/karXvF9acs 5EaafP6wBQgTwlE3b0iV4wI= X-Google-Smtp-Source: AMsMyM5yXI9fys+ecbDjt2yNsL/mOih43onzwERF6aUXXPKnA8tHsu1OejgTmbuNDnSndoV6Z9PR2g== X-Received: by 2002:a17:903:2452:b0:187:99b:c8fe with SMTP id l18-20020a170903245200b00187099bc8femr60899734pls.113.1668027244946; Wed, 09 Nov 2022 12:54:04 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:04 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 06/17] x86/hyperv: Get Virtual Trust Level via hvcall Date: Wed, 9 Nov 2022 15:53:41 -0500 Message-Id: <20221109205353.984745-7-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan sev-snp guest provides vtl(Virtual Trust Level) and get it from hyperv hvcall via HVCALL_GET_VP_REGISTERS. Signed-off-by: Tianyu Lan --- arch/x86/hyperv/hv_init.c | 35 ++++++++++++++++++++++++++++++++++ include/asm-generic/mshyperv.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c index 4600c5941957..5b919d4d24c0 100644 --- a/arch/x86/hyperv/hv_init.c +++ b/arch/x86/hyperv/hv_init.c @@ -390,6 +390,39 @@ static void __init hv_get_partition_id(void) local_irq_restore(flags); } +static u8 __init get_current_vtl(void) +{ + u64 control = ((u64)1 << HV_HYPERCALL_REP_COMP_OFFSET) | HVCALL_GET_VP_REGISTERS; + struct hv_get_vp_registers_input *input = NULL; + struct hv_get_vp_registers_output *output = NULL; + u8 vtl = 0; + int ret; + unsigned long flags; + + local_irq_save(flags); + input = *(struct hv_get_vp_registers_input **)this_cpu_ptr(hyperv_pcpu_input_arg); + output = (struct hv_get_vp_registers_output *)input; + if (!input || !output) { + pr_err("Hyper-V: cannot allocate a shared page!"); + goto done; + } + + memset(input, 0, sizeof(*input) + sizeof(input->element[0])); + input->header.partitionid = HV_PARTITION_ID_SELF; + input->header.inputvtl = 0; + input->element[0].name0 = 0x000D0003; + + ret = hv_do_hypercall(control, input, output); + if (ret == 0) + vtl = output->as64.low & 0xf; + else + pr_err("Hyper-V: failed to get the current VTL!"); + local_irq_restore(flags); + +done: + return vtl; +} + /* * This function is to be invoked early in the boot sequence after the * hypervisor has been detected. @@ -527,6 +560,8 @@ void __init hyperv_init(void) if (hv_is_isolation_supported()) swiotlb_update_mem_attributes(); #endif + /* Find the current VTL */ + ms_hyperv.vtl = get_current_vtl(); return; diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h index bfb9eb9d7215..68133de044ec 100644 --- a/include/asm-generic/mshyperv.h +++ b/include/asm-generic/mshyperv.h @@ -46,6 +46,7 @@ struct ms_hyperv_info { }; }; u64 shared_gpa_boundary; + u8 vtl; }; extern struct ms_hyperv_info ms_hyperv; @@ -55,6 +56,7 @@ extern void * __percpu *hyperv_pcpu_output_arg; extern u64 hv_do_hypercall(u64 control, void *inputaddr, void *outputaddr); extern u64 hv_do_fast_hypercall8(u16 control, u64 input8); extern bool hv_isolation_type_snp(void); +extern bool hv_isolation_type_en_snp(void); /* Helper functions that provide a consistent pattern for checking Hyper-V hypercall status. */ static inline int hv_result(u64 status) From patchwork Wed Nov 9 20:53:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038051 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DBE62C43219 for ; Wed, 9 Nov 2022 20:54:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231544AbiKIUyS (ORCPT ); Wed, 9 Nov 2022 15:54:18 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49156 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231836AbiKIUyH (ORCPT ); Wed, 9 Nov 2022 15:54:07 -0500 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D408B21273; Wed, 9 Nov 2022 12:54:06 -0800 (PST) Received: by mail-pj1-x1031.google.com with SMTP id b1-20020a17090a7ac100b00213fde52d49so3074706pjl.3; Wed, 09 Nov 2022 12:54:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=loq3axK/RYrhXox7s9iRtCxZB75cuqQoJg9zTfXxZb4=; b=beFZ5Y47kp1rJfIpBxAoTPtins11XDT5gcQls7HiwKvU68KQJRTlUxewLDVT5p7d5Z 5ikaFpLZmG09q9dQRVDpgfLnZelttUOzwqcewJ2gfAZBBbijcm6pHDlJZhUH45TcAQ+N iB8pckuHrFxqCLROUWXOs9ukICIqRYYTIc7HFJUWpaFEE42FcklaP2oRbzhSM0VuT/MB DUpE3bCgo8Vx1acGTmV9YgGDEOumV2qf1DF8KeikfFA9pYlv1dr7LDTvWnJng06aTtnD PRf3QjwdUTYmT6n7Ubrc+uRoHp2IUHYucJBikq28PR3a7j1D8I9wi0CeuFUcm/WKi/cq gAdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=loq3axK/RYrhXox7s9iRtCxZB75cuqQoJg9zTfXxZb4=; b=q7bR2cvWO5Bs5/xs/T0d4VjjZ7aJv7cn6mpUaPzNIVFn+p2hm4rkfwOm+Wv2eArBXC o0Ml4i98i6Eg4R9sbPuI0B43JYYEY76iWO/+Ur5GbuLvZYgumJyPS6P8ukL9C8mlEp2H LTGxZgKDvw0mBusAyEkcrIDJStlL321J+WE73tjE80MTv7a8C6H5Hzk7MYUp9P7Es1Wt v2J7/9xkxC1rZIDeUhdJlTzZXX+XZkPD3Hrpd4F/MchRVIZEcu3Ie3luWaLs6nUg4/M8 iUKj2dDB7ruYeRrbl768uOjUBf7EkarG0gbpyNbhIBrbh3M0kQE70ccdRtHVh+edooKQ B++A== X-Gm-Message-State: ACrzQf12Hp6ILYMn8vTEpUaZPuO/fZva1Qfmu7zWdH32sf3G/8hDFUj+ udfsAc5pWOXkFmWZcCCwOy8= X-Google-Smtp-Source: AMsMyM6rVvEWgMW5vzavPLlusbA5iUubIdjccR/BkohqA24lMTdaD6SAoRNDyU+5FoHz/UGGK3QGnA== X-Received: by 2002:a17:90a:eb0c:b0:213:8ff3:a46a with SMTP id j12-20020a17090aeb0c00b002138ff3a46amr69235671pjz.158.1668027246272; Wed, 09 Nov 2022 12:54:06 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:05 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 07/17] x86/hyperv: Use vmmcall to implement hvcall in sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:42 -0500 Message-Id: <20221109205353.984745-8-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan In sev-snp enlightened guest, hvcall needs to use vmmcall to trigger vmexit and notify hypervisor to handle hypercall request. Signed-off-by: Tianyu Lan --- arch/x86/include/asm/mshyperv.h | 66 ++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 21 deletions(-) diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 9b8c3f638845..28d5429e33c9 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -45,16 +45,25 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output) u64 hv_status; #ifdef CONFIG_X86_64 - if (!hv_hypercall_pg) - return U64_MAX; + if (hv_isolation_type_en_snp()) { + __asm__ __volatile__("mov %4, %%r8\n" + "vmmcall" + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input_address) + : "r" (output_address) + : "cc", "memory", "r8", "r9", "r10", "r11"); + } else { + if (!hv_hypercall_pg) + return U64_MAX; - __asm__ __volatile__("mov %4, %%r8\n" - CALL_NOSPEC - : "=a" (hv_status), ASM_CALL_CONSTRAINT, - "+c" (control), "+d" (input_address) - : "r" (output_address), - THUNK_TARGET(hv_hypercall_pg) - : "cc", "memory", "r8", "r9", "r10", "r11"); + __asm__ __volatile__("mov %4, %%r8\n" + CALL_NOSPEC + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input_address) + : "r" (output_address), + THUNK_TARGET(hv_hypercall_pg) + : "cc", "memory", "r8", "r9", "r10", "r11"); + } #else u32 input_address_hi = upper_32_bits(input_address); u32 input_address_lo = lower_32_bits(input_address); @@ -82,12 +91,18 @@ static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1) u64 hv_status, control = (u64)code | HV_HYPERCALL_FAST_BIT; #ifdef CONFIG_X86_64 - { + if (hv_isolation_type_en_snp()) { + __asm__ __volatile__( + "vmmcall" + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input1) + :: "cc", "r8", "r9", "r10", "r11"); + } else { __asm__ __volatile__(CALL_NOSPEC - : "=a" (hv_status), ASM_CALL_CONSTRAINT, - "+c" (control), "+d" (input1) - : THUNK_TARGET(hv_hypercall_pg) - : "cc", "r8", "r9", "r10", "r11"); + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input1) + : THUNK_TARGET(hv_hypercall_pg) + : "cc", "r8", "r9", "r10", "r11"); } #else { @@ -113,14 +128,21 @@ static inline u64 hv_do_fast_hypercall16(u16 code, u64 input1, u64 input2) u64 hv_status, control = (u64)code | HV_HYPERCALL_FAST_BIT; #ifdef CONFIG_X86_64 - { + if (hv_isolation_type_en_snp()) { __asm__ __volatile__("mov %4, %%r8\n" - CALL_NOSPEC - : "=a" (hv_status), ASM_CALL_CONSTRAINT, - "+c" (control), "+d" (input1) - : "r" (input2), - THUNK_TARGET(hv_hypercall_pg) - : "cc", "r8", "r9", "r10", "r11"); + "vmmcall" + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input1) + : "r" (input2) + : "cc", "r8", "r9", "r10", "r11"); + } else { + __asm__ __volatile__("mov %4, %%r8\n" + CALL_NOSPEC + : "=a" (hv_status), ASM_CALL_CONSTRAINT, + "+c" (control), "+d" (input1) + : "r" (input2), + THUNK_TARGET(hv_hypercall_pg) + : "cc", "r8", "r9", "r10", "r11"); } #else { @@ -177,6 +199,7 @@ int hv_map_ioapic_interrupt(int ioapic_id, bool level, int vcpu, int vector, struct hv_interrupt_entry *entry); int hv_unmap_ioapic_interrupt(int ioapic_id, struct hv_interrupt_entry *entry); int hv_set_mem_host_visibility(unsigned long addr, int numpages, bool visible); +int hv_snp_boot_ap(int cpu, unsigned long start_ip); #ifdef CONFIG_AMD_MEM_ENCRYPT void hv_ghcb_msr_write(u64 msr, u64 value); @@ -191,6 +214,7 @@ static inline void hv_ghcb_terminate(unsigned int set, unsigned int reason) {} #endif extern bool hv_isolation_type_snp(void); +extern bool hv_isolation_type_en_snp(void); static inline bool hv_is_synic_reg(unsigned int reg) { From patchwork Wed Nov 9 20:53:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038053 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE21AC433FE for ; Wed, 9 Nov 2022 20:54:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231202AbiKIUyf (ORCPT ); Wed, 9 Nov 2022 15:54:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49228 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231849AbiKIUyI (ORCPT ); Wed, 9 Nov 2022 15:54:08 -0500 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3A88727FC2; Wed, 9 Nov 2022 12:54:08 -0800 (PST) Received: by mail-pl1-x62a.google.com with SMTP id 4so18272097pli.0; Wed, 09 Nov 2022 12:54:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=HkcTs/ArLjoTKDcTyzMU889nkY7DdVdas4PocmXRhm8=; b=CeIjZ46bLRYBnpVZLrKAf8VkB2W1fOZlOxGUusbBUQxlzUdpQx295TWnHxkpII0Dp2 a4H0488JHcX4z9t2ap+TCFt+0s0XwfxrZRXZUjIOZe8AnpRAk0AwRuFX//F9gXKOszYA T+/Htx9zwd2Jqqu3gN/G+ijlEu1A3ndJtAgrCmMD5ZYOQluTQCYhg0AT9hoBZXkAiCGd ppN703MqxcJ737tvo38eXbZLJh1nks2XG/Wtf3ZihdT2y8ynqHYH3zmdf4bxAcsXQDO7 AZycyyMGC3lkgrO5185z9qEuzk5YDbjCzjLZtSzBuHuOuMyNM7C2U8Vb54db+SlrFpWz CwjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=HkcTs/ArLjoTKDcTyzMU889nkY7DdVdas4PocmXRhm8=; b=SxqA0dtK3lV9BO+wG8XicJQRX95FJ52nO5l53RvluDCUkUOEAgesxTWDl7oAfdhm9O qStzxX6+F4fB7RF+sqQP33gmY2Wl656M2kzNg37o1olQLIBHkHGpzuRKJxWaDFqfitti 2XrE0EVxw9S04W0o8EkaFbHbO+bAoG29xBtrjZ+bUkkZoebYpb7QqcUZgyqi6WBOKnvw B9PExgCvh/v8Nqw7ABWsNhLC9nI07iQrNoFT0/yTvVYGtd5mb+dQy5WuaAWBbbDH8R+U FmfPJqJJ4tdSqELwVe3wbcGepTmJ46MT9IHf8vkQTvTsa0pQBazsmDLgBj7DSfb3qq8Z 8wXQ== X-Gm-Message-State: ACrzQf0I1gksN0049+tfC2bJueaeDJNQqeMk3Nc52z8uakyAxW0FfuEG YwpYjFnkZtvPGar5pHgFEpc= X-Google-Smtp-Source: AMsMyM4Lh17BXRY4hReS0g1Y9xn/yYvWeYpDiIQNSS9wyJaw1QhFUrC/eKSI2lxJi7lcJO3aGVN31Q== X-Received: by 2002:a17:902:b40b:b0:17f:628d:2a9 with SMTP id x11-20020a170902b40b00b0017f628d02a9mr1256339plr.70.1668027247697; Wed, 09 Nov 2022 12:54:07 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:07 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 08/17] clocksource: hyper-v: decrypt hyperv tsc page in sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:43 -0500 Message-Id: <20221109205353.984745-9-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Hyper-V tsc page is shared with hypervisor and it should be decrypted in sev-snp enlightened guest when it's used. Signed-off-by: Tianyu Lan --- drivers/clocksource/hyperv_timer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/clocksource/hyperv_timer.c b/drivers/clocksource/hyperv_timer.c index bb47610bbd1c..aa68eebed5ee 100644 --- a/drivers/clocksource/hyperv_timer.c +++ b/drivers/clocksource/hyperv_timer.c @@ -364,7 +364,7 @@ EXPORT_SYMBOL_GPL(hv_stimer_global_cleanup); static union { struct ms_hyperv_tsc_page page; u8 reserved[PAGE_SIZE]; -} tsc_pg __aligned(PAGE_SIZE); +} tsc_pg __bss_decrypted __aligned(PAGE_SIZE); struct ms_hyperv_tsc_page *hv_get_tsc_page(void) { From patchwork Wed Nov 9 20:53:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038055 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9526EC433FE for ; Wed, 9 Nov 2022 20:54:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229967AbiKIUyr (ORCPT ); Wed, 9 Nov 2022 15:54:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231866AbiKIUyK (ORCPT ); Wed, 9 Nov 2022 15:54:10 -0500 Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 87EDF286E4; Wed, 9 Nov 2022 12:54:09 -0800 (PST) Received: by mail-pj1-x1035.google.com with SMTP id h14so17821919pjv.4; Wed, 09 Nov 2022 12:54:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ItxDpPRpAqbvZZHr07qhhxQmPJehVCNLqSw71HrxTxc=; b=DWRKubV2MC8OVFfGb+nU13mlp2BX7hAM1eut4rKlTMym7/NQ2fcKcGHYNKBh7HTtZS EXThdDSzO4SSvhOK/LiW/OM+29uGiTi7Y3JgwXLSJNN8+qc6D0bFkS/678RSdKUCGqzE +PYoX995719to5tZOzZW1J+QGAFHmwSDgL3WY1S9qUDmEaLjLqunOiit3PPX1GoPGjP0 6e0S8EhjlPNXgHoHc6cYoWEQGlO+dXcLwztGHel50aKW1jBpLgzBzui65kIvrC3KiZcS /yIgPna37HHKG07VGReSbunA6KFNFKP4TkXItHdz6BiN/vfPBO6FbdQItxOGP/rt/7rf W6kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ItxDpPRpAqbvZZHr07qhhxQmPJehVCNLqSw71HrxTxc=; b=Rl2b6G9EcAXWDfg/PV85cU2u+ljF4tAk5tWDapBViQ0jYCSt+7t4zbTxNFGU4DF+z0 /e/IMIV/IyTUaPL8pbHZF+XgFiW3oEWr+bqazuo1RfUc7qUsIarboZQ0IXJL7V13SbL+ HvAghUUR0TixrxWCOgyEb5ZJbcOrVfTOjjXCpsLAlK8iEVgw8XYcCazA0qk6EiPvDJM1 ZhlEfev0ohelNeWPU8zkGPmfn2ubIblYMkgPRzLKrnOgzyPkySyVVUc5Xeaem1a83ini Gy8LbU5bV1xD+Nc7SakIUeIHb+R/iFVttbLqI4yggFg9KdfZuNXlg8Td9yd+4p1jHD0D WFhA== X-Gm-Message-State: ACrzQf19V1pEvezqfhAljHhhy8bRrXOUwZpyR9+oaHT2nWSZoiu7lD6R 0HDt8wBzC/NVfFRkjLpzsOQ= X-Google-Smtp-Source: AMsMyM7AIssMTtfAfidjKDntRSvre1lQc9phzpmbWoQTGwqRTUETIf2q29WnvywD1l2Z844x/hYQNg== X-Received: by 2002:a17:902:bcc1:b0:187:31da:494a with SMTP id o1-20020a170902bcc100b0018731da494amr47640218pls.121.1668027249033; Wed, 09 Nov 2022 12:54:09 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:08 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 09/17] x86/hyperv: decrypt vmbus pages for sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:44 -0500 Message-Id: <20221109205353.984745-10-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Vmbus int, synic and post message pages are shared with hypervisor and so decrypt these pages in the sev-snp guest. Signed-off-by: Tianyu Lan --- drivers/hv/connection.c | 13 +++++++++++++ drivers/hv/hv.c | 32 +++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index 9dc27e5d367a..43141225ea15 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -215,6 +215,15 @@ int vmbus_connect(void) (void *)((unsigned long)vmbus_connection.int_page + (HV_HYP_PAGE_SIZE >> 1)); + if (hv_isolation_type_snp() || hv_isolation_type_en_snp()) { + ret = set_memory_decrypted((unsigned long) + vmbus_connection.int_page, 1); + if (ret) + goto cleanup; + + memset(vmbus_connection.int_page, 0, PAGE_SIZE); + } + /* * Setup the monitor notification facility. The 1st page for * parent->child and the 2nd page for child->parent @@ -372,6 +381,10 @@ void vmbus_disconnect(void) destroy_workqueue(vmbus_connection.work_queue); if (vmbus_connection.int_page) { + if (hv_isolation_type_en_snp()) + set_memory_encrypted((unsigned long) + vmbus_connection.int_page, 1); + hv_free_hyperv_page((unsigned long)vmbus_connection.int_page); vmbus_connection.int_page = NULL; } diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c index 4d6480d57546..f9111eb32739 100644 --- a/drivers/hv/hv.c +++ b/drivers/hv/hv.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "hyperv_vmbus.h" /* The one and only */ @@ -117,7 +118,7 @@ int hv_post_message(union hv_connection_id connection_id, int hv_synic_alloc(void) { - int cpu; + int cpu, ret; struct hv_per_cpu_context *hv_cpu; /* @@ -168,6 +169,29 @@ int hv_synic_alloc(void) pr_err("Unable to allocate post msg page\n"); goto err; } + + if (hv_isolation_type_en_snp()) { + ret = set_memory_decrypted((unsigned long) + hv_cpu->synic_message_page, 1); + ret |= set_memory_decrypted((unsigned long) + hv_cpu->synic_event_page, 1); + ret |= set_memory_decrypted((unsigned long) + hv_cpu->post_msg_page, 1); + + if (ret) { + set_memory_encrypted((unsigned long) + hv_cpu->synic_message_page, 1); + set_memory_encrypted((unsigned long) + hv_cpu->synic_event_page, 1); + set_memory_encrypted((unsigned long) + hv_cpu->post_msg_page, 1); + goto err; + } + + memset(hv_cpu->synic_message_page, 0, PAGE_SIZE); + memset(hv_cpu->synic_event_page, 0, PAGE_SIZE); + memset(hv_cpu->post_msg_page, 0, PAGE_SIZE); + } } return 0; @@ -188,6 +212,12 @@ void hv_synic_free(void) struct hv_per_cpu_context *hv_cpu = per_cpu_ptr(hv_context.cpu_context, cpu); + if (hv_isolation_type_en_snp()) { + set_memory_encrypted((unsigned long)hv_cpu->synic_message_page, 1); + set_memory_encrypted((unsigned long)hv_cpu->synic_event_page, 1); + set_memory_encrypted((unsigned long)hv_cpu->post_msg_page, 1); + } + free_page((unsigned long)hv_cpu->synic_event_page); free_page((unsigned long)hv_cpu->synic_message_page); free_page((unsigned long)hv_cpu->post_msg_page); From patchwork Wed Nov 9 20:53:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038056 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DDC15C4332F for ; Wed, 9 Nov 2022 20:54:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231949AbiKIUyt (ORCPT ); Wed, 9 Nov 2022 15:54:49 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49286 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231879AbiKIUyL (ORCPT ); Wed, 9 Nov 2022 15:54:11 -0500 Received: from mail-pl1-x634.google.com (mail-pl1-x634.google.com [IPv6:2607:f8b0:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D775821E19; Wed, 9 Nov 2022 12:54:10 -0800 (PST) Received: by mail-pl1-x634.google.com with SMTP id l2so18196781pld.13; Wed, 09 Nov 2022 12:54:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=wN6eB0wxJRf6zzRxY6T7pa65W2+E1oedx78oWdQ5Oug=; b=cauI3nQmhA4WSX/OaYCTewup7EB+F5FVDFiGvtURXi1E84Ze0iEtTgzD8Rbx2nblxT 2By8+l78vIEz0KaH7vJAwyjM9pmU9ZGJOmOI383sd6iM2L74tJ9tJel90eh7b9aeUuqk jBDlH33hr7pj1RVARknPKi6p4zY/yv+KPeKP1y/JrhdC8Sb7j7O/xk2hEXpiVy8zqzl9 ieSVotSG6yWbedtJP99u8AfkIbg5oPex7F5QEp1bzPUKYz9GHLoiytc78f7cl++wnzfY YlkOGWJ+4m3OU/f+KTPyRBiR+D8bvjmcZXc2iP0tM7201E70469rEtO8RHtJ6GDsA/Yd olhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=wN6eB0wxJRf6zzRxY6T7pa65W2+E1oedx78oWdQ5Oug=; b=G6Bcdwpcmdvz0PjZfG0SeqbuTmjo2aUGN3IC1WRNYxtcboIKN0iukH+oVOnSo2uWiP /oPrngJij+C+JMjARV65yHuG/LXOu6R0ZhbS5lVcm1jg7gqOJNr/pxLLlbXHlcyq9Irk XaagS6VVPoymTUgm00wou6ZukGoTSSbdNkupdxftwNhhwqLwP9oXdi1GCOMPe8rxJjfE K9r7DX/Sj/m2bdcpDsC8HllKsZrLH6Wu8Q1mdihVdTBHpwIjj2Xq5Ug0JulMSyVHVY8X gvPXbEPjUGarUinfSuJjLkBAeG65ZBdXAJRj3JarlzxIoNGHkkKzGjhpqPwPyiC57662 UCHQ== X-Gm-Message-State: ACrzQf3oBpsCWKUxX0CL81cIYOTJ6qdm1fJCs+2Y8ek89LAMWRj9TJVN SLZx58PfYuMcFQpsPweOQBg= X-Google-Smtp-Source: AMsMyM4luDAJu7PT7s5+o53Wz7Ymth7QCE0nP0qncCs9XPoDxi+wgcbfnkDK829znHHtTSew3IYeWw== X-Received: by 2002:a17:902:cac3:b0:186:6ce4:f94a with SMTP id y3-20020a170902cac300b001866ce4f94amr61537422pld.145.1668027250367; Wed, 09 Nov 2022 12:54:10 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:09 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 10/17] x86/hyperv: set target vtl in the vmbus init message Date: Wed, 9 Nov 2022 15:53:45 -0500 Message-Id: <20221109205353.984745-11-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Set target vtl (Virtual Trust Level) in the vmbus init message. Signed-off-by: Tianyu Lan --- drivers/hv/connection.c | 1 + include/linux/hyperv.h | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index 43141225ea15..09a1253b539a 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c @@ -98,6 +98,7 @@ int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, u32 version) */ if (version >= VERSION_WIN10_V5) { msg->msg_sint = VMBUS_MESSAGE_SINT; + msg->msg_vtl = ms_hyperv.vtl; vmbus_connection.msg_conn_id = VMBUS_MESSAGE_CONNECTION_ID_4; } else { msg->interrupt_page = virt_to_phys(vmbus_connection.int_page); diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 3b42264333ef..2be0b5efd1ea 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -665,8 +665,8 @@ struct vmbus_channel_initiate_contact { u64 interrupt_page; struct { u8 msg_sint; - u8 padding1[3]; - u32 padding2; + u8 msg_vtl; + u8 reserved[6]; }; }; u64 monitor_page1; From patchwork Wed Nov 9 20:53:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038059 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6B673C4321E for ; Wed, 9 Nov 2022 20:54:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231849AbiKIUy5 (ORCPT ); Wed, 9 Nov 2022 15:54:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49302 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231891AbiKIUyM (ORCPT ); Wed, 9 Nov 2022 15:54:12 -0500 Received: from mail-pl1-x62d.google.com (mail-pl1-x62d.google.com [IPv6:2607:f8b0:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 40B5E27FC2; Wed, 9 Nov 2022 12:54:12 -0800 (PST) Received: by mail-pl1-x62d.google.com with SMTP id b21so18218700plc.9; Wed, 09 Nov 2022 12:54:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xAXRqP2y00DrPAfpogwk3TLv9UhC4S/D5/TlIyE91Hw=; b=Te6H+TH+yST8c6KwaFmZrKwGmb/qFLAP4Ijs+O0sg16ggjNVi1pniMt8qRquxctGo8 bG894KSqsGQzNTkQVawrXkjvUz4MBGbwm5emlok9cQrNP4cVVAoh/pKOj7RYoX8RYy4a t1rVYkdBA4ze+dGdcEbpVjwLF6N3/v38VH0wLJF3nyT4/ZqSA+Vgy135v+xS+BMvGnRx kOxqG5zEKlE9xIXEp3MFMedPJVROB5SwJ52rVvpQLyxHQ4jlNbjNYliYygSrqD1HqhrQ MuqDpIY5atERxparXSh5/f7em9davf9PVRDaVx8XB4m01uKCdc55EVJoWHRc87AEZ/jR 2Pfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xAXRqP2y00DrPAfpogwk3TLv9UhC4S/D5/TlIyE91Hw=; b=DdvZVPn7QHmKcYJAd1scW8gBiT82UIs8QII7Jt9MXcxyn7MnrBH4VHNC2oCF6jSeL5 LLt0Mhmzs/ZOiuKZK9HCdJ2p5srefmNLe+2sFNrEOg9fQV5SC2nsobdhuj1KypieQTDi maX7vjhsJBKmYahfWBY0PEdX1Fj3YZFkopHMhSLk1xhh9+T0kI4GtgrNl34Kj8e6C0Ix EKq2U4OGbm/5+gB7uDa4HDyo+0CSyZ8gRTPEQFJNFxcT8NuON637NR4pqHTHVRk74aii 7g3g192BewBD/qwwxdwvn4LGr8/PNmjtEqH020mxPdr1FB69kQXqC2/zUJCBjRWRYAzC 2SXA== X-Gm-Message-State: ACrzQf1OxfTPc6E/UT72CV7u++hyeIlEujWWRtPa79auV8LaFxWoFmMN tNxq5Tu99u4wLc4TEqJLRIA= X-Google-Smtp-Source: AMsMyM6FKraDvmCSKM8SltaKBfYOM83RXMvfiFmhKbOkh7EavSs25oEeebRK8YEEiRnFDRRvUgoSDA== X-Received: by 2002:a17:902:b70c:b0:179:eb79:cf9a with SMTP id d12-20020a170902b70c00b00179eb79cf9amr62100881pls.130.1668027251732; Wed, 09 Nov 2022 12:54:11 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:11 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 11/17] drivers: hv: Decrypt percpu hvcall input arg page in sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:46 -0500 Message-Id: <20221109205353.984745-12-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Hypervisor needs to access iput arg page and guest should decrypt the page. Signed-off-by: Tianyu Lan --- drivers/hv/hv_common.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c index 2c6602571c47..c16961e686a0 100644 --- a/drivers/hv/hv_common.c +++ b/drivers/hv/hv_common.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -125,6 +126,7 @@ int hv_common_cpu_init(unsigned int cpu) u64 msr_vp_index; gfp_t flags; int pgcount = hv_root_partition ? 2 : 1; + int ret; /* hv_cpu_init() can be called with IRQs disabled from hv_resume() */ flags = irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL; @@ -134,6 +136,16 @@ int hv_common_cpu_init(unsigned int cpu) if (!(*inputarg)) return -ENOMEM; + if (hv_isolation_type_en_snp()) { + ret = set_memory_decrypted((unsigned long)*inputarg, 1); + if (ret) { + kfree(*inputarg); + return ret; + } + + memset(*inputarg, 0x00, PAGE_SIZE); + } + if (hv_root_partition) { outputarg = (void **)this_cpu_ptr(hyperv_pcpu_output_arg); *outputarg = (char *)(*inputarg) + HV_HYP_PAGE_SIZE; @@ -168,6 +180,9 @@ int hv_common_cpu_die(unsigned int cpu) local_irq_restore(flags); + if (hv_isolation_type_en_snp()) + set_memory_encrypted((unsigned long)mem, 1); + kfree(mem); return 0; From patchwork Wed Nov 9 20:53:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038061 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A773EC4332F for ; Wed, 9 Nov 2022 20:55:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231835AbiKIUzE (ORCPT ); Wed, 9 Nov 2022 15:55:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49320 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231899AbiKIUyO (ORCPT ); Wed, 9 Nov 2022 15:54:14 -0500 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7C51B21E19; Wed, 9 Nov 2022 12:54:13 -0800 (PST) Received: by mail-pj1-x1032.google.com with SMTP id m14-20020a17090a3f8e00b00212dab39bcdso3031647pjc.0; Wed, 09 Nov 2022 12:54:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=eHfQ2xg7TSoUMJoNFBa3Rt6P1l7onXyfXsIWqOdHwnM=; b=RoWVDilVrKK3rtGd+U699PreMvaGOIMTIX/XykJMqP42PVj5Iq81ahH3L4F5hFZd0A 5vwnAKhGAyYFY1inoHLhxMpldICCqv39wySi8jY72iSrUdv7kVHC1+SzUzGZqdjtt/lo J+DKeLS4leA20VZkn3g1/ZNeD9reIEbRSspL6Vz7NjMQVMiW6wfLnWgR39NFn1t+Gbi3 8T39p8AGxmUs/k4xhYo9RmMr68dFWHgosRw2b5nfUx4HJBVZuA6ch7OGhI69k+qGwISx e3pBmQMTB0YSeHhn9/A6CeHiKhO0ebf7eZ6hAsdavCsn5Alxat+YYvoLQy5PRJI2crN0 CT4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eHfQ2xg7TSoUMJoNFBa3Rt6P1l7onXyfXsIWqOdHwnM=; b=L+X2+X/21Qy++Ah1vVGwZ+DObeOIB9mfh+Q1C+DSUO3jrHY21IC92ZwlCF+zK2+/e0 81SG5EuLORYBtlECmhWQE3dZaBL/6Wv8JZCtYiHwWB+bjGxbnud/GqY2Hg4Mbwl+5C5k ernDPY8WpjFrChXhevEQw480korWiTDjgerLQT42ihQ2JI4TP4AgEkn2CQOZB/WGaDDg ILhcMb4k1aimx2zr5Aw8JFqqXlnUlBWVTgWnu1JP1Rmwk03xKuM7+qhkQ9nOlumRb62b 5CQDUY7lz9BwE6qbWl1xtGMp7ERje1a9hlz5eErgKUQY4HWbJ6EHSqPsroHwYxz4EgmC nfOQ== X-Gm-Message-State: ACrzQf3rvB9zYjQgnB2Vx8PSSKCTwiqqSP4dkRx9+rwFTBIkx4xYtR7X izZglTbAk5UheEH5JqDgUtw= X-Google-Smtp-Source: AMsMyM5JzC6xTKJnfugh/fefFqIJHxrJc+UP+NLYmexS0BeRNfMrmpTXylZsm2XxZ0ULmf4HQIg2HQ== X-Received: by 2002:a17:902:7688:b0:187:403c:7a2b with SMTP id m8-20020a170902768800b00187403c7a2bmr43513901pll.85.1668027253050; Wed, 09 Nov 2022 12:54:13 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:12 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 12/17] Drivers: hv: vmbus: Decrypt vmbus ring buffer Date: Wed, 9 Nov 2022 15:53:47 -0500 Message-Id: <20221109205353.984745-13-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan The ring buffer is remapped in the hv_ringbuffer_init() and it should be with decrypt flag in order to share it with hypervisor in sev-snp enlightened guest. Signed-off-by: Tianyu Lan --- drivers/hv/ring_buffer.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/hv/ring_buffer.c b/drivers/hv/ring_buffer.c index 59a4aa86d1f3..391995c76be7 100644 --- a/drivers/hv/ring_buffer.c +++ b/drivers/hv/ring_buffer.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include "hyperv_vmbus.h" @@ -233,14 +234,18 @@ int hv_ringbuffer_init(struct hv_ring_buffer_info *ring_info, ring_info->ring_buffer = (struct hv_ring_buffer *) vmap(pages_wraparound, page_cnt * 2 - 1, VM_MAP, + hv_isolation_type_en_snp() ? + pgprot_decrypted(PAGE_KERNEL_NOENC) : PAGE_KERNEL); + if (hv_isolation_type_en_snp()) + memset(ring_info->ring_buffer, 0x00, page_cnt * PAGE_SIZE); + kfree(pages_wraparound); if (!ring_info->ring_buffer) return -ENOMEM; } - ring_info->ring_buffer->read_index = ring_info->ring_buffer->write_index = 0; From patchwork Wed Nov 9 20:53:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038060 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 867DFC433FE for ; Wed, 9 Nov 2022 20:55:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232053AbiKIUzA (ORCPT ); Wed, 9 Nov 2022 15:55:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49290 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231927AbiKIUyQ (ORCPT ); Wed, 9 Nov 2022 15:54:16 -0500 Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1441130F71; Wed, 9 Nov 2022 12:54:15 -0800 (PST) Received: by mail-pg1-x52e.google.com with SMTP id 6so9102965pgm.6; Wed, 09 Nov 2022 12:54:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=w0YgLiOl0S0PjO9RGU6dEILmddfdRljq1tR8KTSAHbs=; b=QO4DvPkJIb71Vac+YgbUUc8naxai3q2LPii1mDdSVwgYpblLLIwhA/6QV1KYf15pY/ NEUYzqFaur0JJkEXlRjtQ4KR4E4SqwsdYaV6XcvXtPNCN9AsH3foUs7OeJD8rvNSdp2H 3MKTN62NQdiPSs2fPoNXsvAH6geS/6AjfCFpwuYSPzKWhiKpu0prdr/L4etZOFejb3cD KfHjXpwQsnVYIUjzopLUFAr76G9TxCtb2JqAFo+ThZk5fSwojKTsX3V8N2E1Hibf6QeS A0bm9BNby9qSQJ9seF1ouaDu0eE9glPVhXXZ3DR8upimA9v5vwgTFn+9t7oOdDUE6JpZ gomg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=w0YgLiOl0S0PjO9RGU6dEILmddfdRljq1tR8KTSAHbs=; b=EQK1Baz/b7p13CT6+w88DbulCCOiVIIEaR6No2vxve2+B3oM3DAldtcP2Xd+baKbpx XTg9IsE5uq0uUW2fi7nf9pjOXTsNv758uV72BdiXOmf2SQ9uKR2bFH3b6br9xF8vkYZq lfu8LOufDw7BoezhSLg3azKBVzqBvs8Z5Ah9ps+JPYgNzB6DATSV5lV+VOjLUDXVM8/Y PnLcHgdHI+7uMfknXGPr1RcfUMLdAHPFy2Fy1Gdj48gvmnH307A1l13COCuniX73db+Q 6LjQ3nnNB+LcFAgVZodKCMVH4lON6wzjsT4sJV1P8xNaj6yWoEkHLgE5YCYgYEwlldmy U8Hw== X-Gm-Message-State: ACrzQf3w0m2Rer6OCB2FgHbw5inXKfotl0sw2NY9mDmNb7ObZLb5GJna EoZadd40RxFD57ecX9B5B6U= X-Google-Smtp-Source: AMsMyM60Ruxwb0NOF8P4hL8khXQbh9yWk/7QP60EiXK3zdUhyTP2S4gkYhG405QgLG2mLS60n+JzOA== X-Received: by 2002:a63:de46:0:b0:46e:c3bd:e47d with SMTP id y6-20020a63de46000000b0046ec3bde47dmr52358101pgi.609.1668027254437; Wed, 09 Nov 2022 12:54:14 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:13 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 13/17] x86/hyperv: Initialize cpu and memory for sev-snp enlightened guest Date: Wed, 9 Nov 2022 15:53:48 -0500 Message-Id: <20221109205353.984745-14-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Read processor amd memory info from specific address which are populated by Hyper-V. Initialize smp cpu related ops, pvalidate system memory and add it into e820 table. Signed-off-by: Tianyu Lan --- arch/x86/kernel/cpu/mshyperv.c | 75 ++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 2ea4f21c6172..f0c97210c64a 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -34,6 +34,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include /* Is Linux running as the root partition? */ bool hv_root_partition; @@ -253,6 +259,33 @@ static void __init hv_smp_prepare_cpus(unsigned int max_cpus) } #endif +static __init int hv_snp_set_rtc_noop(const struct timespec64 *now) { return -EINVAL; } +static __init void hv_snp_get_rtc_noop(struct timespec64 *now) { } + +static u32 processor_count; + +static __init void hv_snp_get_smp_config(unsigned int early) +{ + if (!early) { + while (num_processors < processor_count) { + early_per_cpu(x86_cpu_to_apicid, num_processors) = num_processors; + early_per_cpu(x86_bios_cpu_apicid, num_processors) = num_processors; + physid_set(num_processors, phys_cpu_present_map); + set_cpu_possible(num_processors, true); + set_cpu_present(num_processors, true); + num_processors++; + } + } +} + +struct memory_map_entry { + u64 starting_gpn; + u64 numpages; + u16 type; + u16 flags; + u32 reserved; +}; + static void __init ms_hyperv_init_platform(void) { int hv_max_functions_eax; @@ -260,6 +293,11 @@ static void __init ms_hyperv_init_platform(void) int hv_host_info_ebx; int hv_host_info_ecx; int hv_host_info_edx; + struct memory_map_entry *entry; + struct e820_entry *e820_entry; + u64 e820_end; + u64 ram_end; + u64 page; #ifdef CONFIG_PARAVIRT pv_info.name = "Hyper-V"; @@ -477,6 +515,43 @@ static void __init ms_hyperv_init_platform(void) if (!(ms_hyperv.features & HV_ACCESS_TSC_INVARIANT)) mark_tsc_unstable("running on Hyper-V"); + if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) { + x86_platform.legacy.reserve_bios_regions = 0; + x86_platform.set_wallclock = hv_snp_set_rtc_noop; + x86_platform.get_wallclock = hv_snp_get_rtc_noop; + x86_init.resources.probe_roms = x86_init_noop; + x86_init.resources.reserve_resources = x86_init_noop; + x86_init.mpparse.find_smp_config = x86_init_noop; + x86_init.mpparse.get_smp_config = hv_snp_get_smp_config; + + /* + * Hyper-V SEV-SNP enlightened guest doesn't support ioapic + * and legacy APIC page read/write. Switch to hv apic here. + */ + disable_ioapic_support(); + hv_apic_init(); + + processor_count = *(u32 *)__va(EN_SEV_SNP_PROCESSOR_INFO_ADDR); + + entry = (struct memory_map_entry *)(__va(EN_SEV_SNP_PROCESSOR_INFO_ADDR) + + sizeof(struct memory_map_entry)); + + for (; entry->numpages != 0; entry++) { + e820_entry = &e820_table->entries[e820_table->nr_entries - 1]; + e820_end = e820_entry->addr + e820_entry->size; + ram_end = (entry->starting_gpn + entry->numpages) * PAGE_SIZE; + + if (e820_end < entry->starting_gpn * PAGE_SIZE) + e820_end = entry->starting_gpn * PAGE_SIZE; + if (e820_end < ram_end) { + pr_info("Hyper-V: add [mem %#018Lx-%#018Lx]\n", e820_end, ram_end - 1); + e820__range_add(e820_end, ram_end - e820_end, E820_TYPE_RAM); + for (page = e820_end; page < ram_end; page += PAGE_SIZE) + pvalidate((unsigned long)__va(page), RMP_PG_SIZE_4K, true); + } + } + } + hardlockup_detector_disable(); } From patchwork Wed Nov 9 20:53:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038063 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A5054C4332F for ; Wed, 9 Nov 2022 20:55:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229974AbiKIUzJ (ORCPT ); Wed, 9 Nov 2022 15:55:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231950AbiKIUyS (ORCPT ); Wed, 9 Nov 2022 15:54:18 -0500 Received: from mail-pg1-x533.google.com (mail-pg1-x533.google.com [IPv6:2607:f8b0:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 661062D759; Wed, 9 Nov 2022 12:54:16 -0800 (PST) Received: by mail-pg1-x533.google.com with SMTP id v3so17241862pgh.4; Wed, 09 Nov 2022 12:54:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=KHQxOX05VuPCuHlsy0vXM0F/fWibSFir6W5PfPRogHE=; b=l6rdGXRkcWN+drGlDK/ZEvZzAwEKNDPZu4svTBS14EpXmNxaOJH2Oe0VOOUwg4ncO8 /JhToHQMwQ8+09f8mVeyCvPlvSVCzQlk6SiWbVmfOhsJv/0iwWxn5nCk0Q2RpfhBfVkb Jp0qM8251r5tuOpwaL5sUScpGxMSnkGfwKLikOyX8CXgaMMHzf8j4ZHFRXzsFsVG2su4 /65cwkIqR2pD37SAOFdRAS/ivnr/hVR6bdx+smVqLoCrYBPI/tK1dlLLNMlT7FowxXlU fYNpG+B6SkmI9yry3sZkZV1+YqnSKVNYKryFQcejbJO2g4BCiY+A4kqVLUdRlMvCGDEX k96g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KHQxOX05VuPCuHlsy0vXM0F/fWibSFir6W5PfPRogHE=; b=7GYCowDJrvvYMKXw2xpRHH4+CMlBGqD2/ypVZM8DliW3/tc5TvJme2fI9myNbNLsiX hK1hs02sLrhE6CfOC8Uo0PX8g4hWDSPG0DYLCnargoWKTfReCKbx2waWTXTnrxscDi97 6PaFgumkiV2oTan6q1vqn7kQpDRcIgZ6Pc9KX5mb3OxKKoJ3di5BRt2KACsK6gp22LVx fu/vlFu30kB7px5NPQXNHUY4tv4kDyLvnd3QyC2EXYQCpmz5F8J34Kd9w8+8zzHqU2KX 2t3Wx4u8isA+4IVuXwomev7i9e+Tr+VbQAT+cP4v2kAm/Ekoa/o75DQ2W/1pvxV9kxVm uBDg== X-Gm-Message-State: ANoB5plUT0cdSK0i6DgQj9Ouhg4UMuB57FYSW8VJ5AUfu+L5hE59B4K1 MMna/lQ1dSDoJaUJfKqEviA= X-Google-Smtp-Source: AA0mqf6C2Mi/rVU6cQ41Ll9xJELaEDOtpVMObe/H66xo9SZIrnxQM4m7KlxJaJnETtYShGOnOcdMuA== X-Received: by 2002:a63:f403:0:b0:470:6ed3:5454 with SMTP id g3-20020a63f403000000b004706ed35454mr16573050pgi.191.1668027255837; Wed, 09 Nov 2022 12:54:15 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:15 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 14/17] x86/hyperv: Add smp support for sev-snp guest Date: Wed, 9 Nov 2022 15:53:49 -0500 Message-Id: <20221109205353.984745-15-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan The wakeup_secondary_cpu callback was populated with wakeup_ cpu_via_vmgexit() which doesn't work for Hyper-V. Override it with Hyper-V specific hook which uses HVCALL_START_VIRTUAL_ PROCESSOR hvcall to start AP with vmsa data structure. Signed-off-by: Tianyu Lan --- arch/x86/include/asm/sev.h | 13 +++ arch/x86/include/asm/svm.h | 55 ++++++++++- arch/x86/kernel/cpu/mshyperv.c | 147 +++++++++++++++++++++++++++++- include/asm-generic/hyperv-tlfs.h | 18 ++++ 4 files changed, 230 insertions(+), 3 deletions(-) diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h index ebc271bb6d8e..e34aaf730220 100644 --- a/arch/x86/include/asm/sev.h +++ b/arch/x86/include/asm/sev.h @@ -86,6 +86,19 @@ extern bool handle_vc_boot_ghcb(struct pt_regs *regs); #define RMPADJUST_VMSA_PAGE_BIT BIT(16) +union sev_rmp_adjust { + u64 as_uint64; + struct { + unsigned long target_vmpl : 8; + unsigned long enable_read : 1; + unsigned long enable_write : 1; + unsigned long enable_user_execute : 1; + unsigned long enable_kernel_execute : 1; + unsigned long reserved1 : 4; + unsigned long vmsa : 1; + }; +}; + /* SNP Guest message request */ struct snp_req_data { unsigned long req_gpa; diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index 0361626841bc..fc54d3e7f817 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -328,8 +328,61 @@ struct vmcb_save_area { u64 br_to; u64 last_excp_from; u64 last_excp_to; - u8 reserved_6[72]; + + /* + * The following part of the save area is valid only for + * SEV-ES guests when referenced through the GHCB or for + * saving to the host save area. + */ + u8 reserved_7[72]; u32 spec_ctrl; /* Guest version of SPEC_CTRL at 0x2E0 */ + u8 reserved_7b[4]; + u32 pkru; + u8 reserved_7a[20]; + u64 reserved_8; /* rax already available at 0x01f8 */ + u64 rcx; + u64 rdx; + u64 rbx; + u64 reserved_9; /* rsp already available at 0x01d8 */ + u64 rbp; + u64 rsi; + u64 rdi; + u64 r8; + u64 r9; + u64 r10; + u64 r11; + u64 r12; + u64 r13; + u64 r14; + u64 r15; + u8 reserved_10[16]; + u64 sw_exit_code; + u64 sw_exit_info_1; + u64 sw_exit_info_2; + u64 sw_scratch; + union { + u64 sev_features; + struct { + u64 sev_feature_snp : 1; + u64 sev_feature_vtom : 1; + u64 sev_feature_reflectvc : 1; + u64 sev_feature_restrict_injection : 1; + u64 sev_feature_alternate_injection : 1; + u64 sev_feature_full_debug : 1; + u64 sev_feature_reserved1 : 1; + u64 sev_feature_snpbtb_isolation : 1; + u64 sev_feature_resrved2 : 56; + }; + }; + u64 vintr_ctrl; + u64 guest_error_code; + u64 virtual_tom; + u64 tlb_id; + u64 pcpu_id; + u64 event_inject; + u64 xcr0; + u8 valid_bitmap[16]; + u64 x87_state_gpa; } __packed; /* Save area definition for SEV-ES and SEV-SNP guests */ diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index f0c97210c64a..b266f648e5cd 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -41,6 +41,10 @@ #include #include +#define EN_SEV_SNP_PROCESSOR_INFO_ADDR 0x802000 +#define HV_AP_INIT_GPAT_DEFAULT 0x0007040600070406ULL +#define HV_AP_SEGMENT_LIMIT 0xffffffff + /* Is Linux running as the root partition? */ bool hv_root_partition; struct ms_hyperv_info ms_hyperv; @@ -232,6 +236,136 @@ static void __init hv_smp_prepare_boot_cpu(void) #endif } +static u8 ap_start_input_arg[PAGE_SIZE] __bss_decrypted __aligned(PAGE_SIZE); +static u8 ap_start_stack[PAGE_SIZE] __aligned(PAGE_SIZE); + +int hv_snp_boot_ap(int cpu, unsigned long start_ip) +{ + struct vmcb_save_area *vmsa = (struct vmcb_save_area *) + __get_free_page(GFP_KERNEL | __GFP_ZERO); + struct desc_ptr gdtr; + u64 ret, retry = 5; + struct hv_enable_vp_vtl_input *enable_vtl_input; + struct hv_start_virtual_processor_input *start_vp_input; + union sev_rmp_adjust rmp_adjust; + void **arg; + unsigned long flags; + + *(void **)per_cpu_ptr(hyperv_pcpu_input_arg, cpu) = ap_start_input_arg; + + hv_vp_index[cpu] = cpu; + + /* Prevent APs from entering busy calibration loop */ + preset_lpj = lpj_fine; + + /* Replace the provided real-mode start_ip */ + start_ip = (unsigned long)secondary_startup_64_no_verify; + + native_store_gdt(&gdtr); + + vmsa->gdtr.base = gdtr.address; + vmsa->gdtr.limit = gdtr.size; + + asm volatile("movl %%es, %%eax;" : "=a" (vmsa->es.selector)); + if (vmsa->es.selector) { + vmsa->es.base = 0; + vmsa->es.limit = HV_AP_SEGMENT_LIMIT; + vmsa->es.attrib = *(u16 *)(vmsa->gdtr.base + vmsa->es.selector + 5); + vmsa->es.attrib = (vmsa->es.attrib & 0xFF) | ((vmsa->es.attrib >> 4) & 0xF00); + } + + asm volatile("movl %%cs, %%eax;" : "=a" (vmsa->cs.selector)); + if (vmsa->cs.selector) { + vmsa->cs.base = 0; + vmsa->cs.limit = HV_AP_SEGMENT_LIMIT; + vmsa->cs.attrib = *(u16 *)(vmsa->gdtr.base + vmsa->cs.selector + 5); + vmsa->cs.attrib = (vmsa->cs.attrib & 0xFF) | ((vmsa->cs.attrib >> 4) & 0xF00); + } + + asm volatile("movl %%ss, %%eax;" : "=a" (vmsa->ss.selector)); + if (vmsa->ss.selector) { + vmsa->ss.base = 0; + vmsa->ss.limit = HV_AP_SEGMENT_LIMIT; + vmsa->ss.attrib = *(u16 *)(vmsa->gdtr.base + vmsa->ss.selector + 5); + vmsa->ss.attrib = (vmsa->ss.attrib & 0xFF) | ((vmsa->ss.attrib >> 4) & 0xF00); + } + + asm volatile("movl %%ds, %%eax;" : "=a" (vmsa->ds.selector)); + if (vmsa->ds.selector) { + vmsa->ds.base = 0; + vmsa->ds.limit = HV_AP_SEGMENT_LIMIT; + vmsa->ds.attrib = *(u16 *)(vmsa->gdtr.base + vmsa->ds.selector + 5); + vmsa->ds.attrib = (vmsa->ds.attrib & 0xFF) | ((vmsa->ds.attrib >> 4) & 0xF00); + } + + vmsa->efer = native_read_msr(MSR_EFER); + + asm volatile("movq %%cr4, %%rax;" : "=a" (vmsa->cr4)); + asm volatile("movq %%cr3, %%rax;" : "=a" (vmsa->cr3)); + asm volatile("movq %%cr0, %%rax;" : "=a" (vmsa->cr0)); + + vmsa->xcr0 = 1; + vmsa->g_pat = HV_AP_INIT_GPAT_DEFAULT; + vmsa->rip = (u64)start_ip; + vmsa->rsp = (u64)&ap_start_stack[PAGE_SIZE]; + + vmsa->sev_feature_snp = 1; + vmsa->sev_feature_restrict_injection = 1; + + rmp_adjust.as_uint64 = 0; + rmp_adjust.target_vmpl = 1; + rmp_adjust.vmsa = 1; + ret = rmpadjust((unsigned long)vmsa, RMP_PG_SIZE_4K, + rmp_adjust.as_uint64); + if (ret != 0) { + pr_err("RMPADJUST(%llx) failed: %llx\n", (u64)vmsa, ret); + return ret; + } + + local_irq_save(flags); + arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg); + if (unlikely(!*arg)) { + ret = -ENOMEM; + goto done; + } + + if (ms_hyperv.vtl != 0) { + enable_vtl_input = (struct hv_enable_vp_vtl_input *)*arg; + memset(enable_vtl_input, 0, sizeof(*enable_vtl_input)); + enable_vtl_input->partitionid = -1; + enable_vtl_input->vpindex = cpu; + enable_vtl_input->targetvtl = ms_hyperv.vtl; + *(u64 *)&enable_vtl_input->context[0] = __pa(vmsa) | 1; + + ret = hv_do_hypercall(HVCALL_ENABLE_VP_VTL, enable_vtl_input, NULL); + if (ret != 0) { + pr_err("HvCallEnableVpVtl failed: %llx\n", ret); + goto done; + } + } + + start_vp_input = (struct hv_start_virtual_processor_input *)*arg; + memset(start_vp_input, 0, sizeof(*start_vp_input)); + start_vp_input->partitionid = -1; + start_vp_input->vpindex = cpu; + start_vp_input->targetvtl = ms_hyperv.vtl; + *(u64 *)&start_vp_input->context[0] = __pa(vmsa) | 1; + + do { + ret = hv_do_hypercall(HVCALL_START_VIRTUAL_PROCESSOR, + start_vp_input, NULL); + } while (ret == HV_STATUS_TIME_OUT && retry--); + + if (ret != 0) { + pr_err("HvCallStartVirtualProcessor failed: %llx\n", ret); + goto done; + } + +done: + local_irq_restore(flags); + return ret; +} + static void __init hv_smp_prepare_cpus(unsigned int max_cpus) { #ifdef CONFIG_X86_64 @@ -241,6 +375,16 @@ static void __init hv_smp_prepare_cpus(unsigned int max_cpus) native_smp_prepare_cpus(max_cpus); + /* + * Override wakeup_secondary_cpu callback for SEV-SNP + * enlightened guest. + */ + if (hv_isolation_type_en_snp()) + apic->wakeup_secondary_cpu = hv_snp_boot_ap; + + if (!hv_root_partition) + return; + #ifdef CONFIG_X86_64 for_each_present_cpu(i) { if (i == 0) @@ -489,8 +633,7 @@ static void __init ms_hyperv_init_platform(void) # ifdef CONFIG_SMP smp_ops.smp_prepare_boot_cpu = hv_smp_prepare_boot_cpu; - if (hv_root_partition) - smp_ops.smp_prepare_cpus = hv_smp_prepare_cpus; + smp_ops.smp_prepare_cpus = hv_smp_prepare_cpus; # endif /* diff --git a/include/asm-generic/hyperv-tlfs.h b/include/asm-generic/hyperv-tlfs.h index 6e2a090e2649..7072adbf5540 100644 --- a/include/asm-generic/hyperv-tlfs.h +++ b/include/asm-generic/hyperv-tlfs.h @@ -139,6 +139,7 @@ struct ms_hyperv_tsc_page { #define HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST 0x0003 #define HVCALL_NOTIFY_LONG_SPIN_WAIT 0x0008 #define HVCALL_SEND_IPI 0x000b +#define HVCALL_ENABLE_VP_VTL 0x000f #define HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX 0x0013 #define HVCALL_FLUSH_VIRTUAL_ADDRESS_LIST_EX 0x0014 #define HVCALL_SEND_IPI_EX 0x0015 @@ -156,6 +157,7 @@ struct ms_hyperv_tsc_page { #define HVCALL_MAP_DEVICE_INTERRUPT 0x007c #define HVCALL_UNMAP_DEVICE_INTERRUPT 0x007d #define HVCALL_RETARGET_INTERRUPT 0x007e +#define HVCALL_START_VIRTUAL_PROCESSOR 0x0099 #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_SPACE 0x00af #define HVCALL_FLUSH_GUEST_PHYSICAL_ADDRESS_LIST 0x00b0 #define HVCALL_MODIFY_SPARSE_GPA_PAGE_HOST_VISIBILITY 0x00db @@ -763,6 +765,22 @@ struct hv_input_unmap_device_interrupt { struct hv_interrupt_entry interrupt_entry; } __packed; +struct hv_enable_vp_vtl_input { + u64 partitionid; + u32 vpindex; + u8 targetvtl; + u8 padding[3]; + u8 context[0xe0]; +} __packed; + +struct hv_start_virtual_processor_input { + u64 partitionid; + u32 vpindex; + u8 targetvtl; + u8 padding[3]; + u8 context[0xe0]; +} __packed; + #define HV_SOURCE_SHADOW_NONE 0x0 #define HV_SOURCE_SHADOW_BRIDGE_BUS_RANGE 0x1 From patchwork Wed Nov 9 20:53:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038062 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id EC472C433FE for ; Wed, 9 Nov 2022 20:55:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231795AbiKIUzG (ORCPT ); Wed, 9 Nov 2022 15:55:06 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231956AbiKIUyS (ORCPT ); Wed, 9 Nov 2022 15:54:18 -0500 Received: from mail-pj1-x1035.google.com (mail-pj1-x1035.google.com [IPv6:2607:f8b0:4864:20::1035]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 97C7C27FC2; Wed, 9 Nov 2022 12:54:17 -0800 (PST) Received: by mail-pj1-x1035.google.com with SMTP id d13-20020a17090a3b0d00b00213519dfe4aso3077077pjc.2; Wed, 09 Nov 2022 12:54:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Dn38defXSzafrqFyjuRL6cm4llsqPTH+TKtsPBjqhmM=; b=lfZRX5NGow153M4vN3Z4ZCj49elmfXjCWv5nxlpmQjd0I/CYXnOpbtegjARAeJ3SJg xn7rmQO5a5P7JpbRe6+pWM1PfdDxN+TIkfVPNg9mqrJP4CgpkIrHE/hzMuQLbpFpR7hN HE/BKsy6gB7wwxHParnSkaocSnsnzpWlkZGMRI479Z9BBKdD2pg7449H68LpexccROn0 MgGqBvVh7XvKS/IohwBiV4JQjP0fn7Yk2xK24Al16fQ45VIZ1+oLPZ73nnnJd1oz8E3g XCGMAQzAOI1PddmTVAjA2v0vmGEUwL2j/xgwEtLHSExoWT89y0WQM/zCxi7sjcxqr5nf VMEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Dn38defXSzafrqFyjuRL6cm4llsqPTH+TKtsPBjqhmM=; b=jwbU9J3JgXK9Ke6lTuwWgR+3WLHQpJNDE8XZ5HgbvkpecHTcI2dxvMByPJlXW3gXhJ qctz1yUHTOroVP1btNF9WvF3qrOp7AIhNagD2lDYx/aY8M3O0YV8BoGd+QnMXZSyRs7h 9xVIYIIq6gTf0x4TitGxsEs5PnikQwxj3vXwiKN1Qi3qrzzhOKeVZlM2YmzgzyK39T35 4mjFhQdt5iCGWNYJ2jHVAocugVXnJh/09jOzQUQhoHarGQec9HSVyWZTRj2cwk8Y+cFE aCSJXlCL0vHteL4m94se5Ny0ZZ38NLa8+KOCdCgysSUlHP3iRO65dyWZrIlfNDUVafSz 4/lA== X-Gm-Message-State: ACrzQf2BWzgFmj6yLFLzmbnYmcZwvhANM2c/veom05ELVPA4jRZBWwgu pvMOquTFLrrn8GTaY/H/UIw= X-Google-Smtp-Source: AMsMyM7oRzgrO8TTJgQW/ccS2UAoreul+XZbUOvsQD/Z5T3CeksjRX87V1DABGERO8mjy/ZPYyu17w== X-Received: by 2002:a17:90a:b383:b0:216:df8f:3c3 with SMTP id e3-20020a17090ab38300b00216df8f03c3mr31977635pjr.8.1668027257135; Wed, 09 Nov 2022 12:54:17 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:16 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 15/17] x86/hyperv: Add hyperv-specific hadling for VMMCALL under SEV-ES Date: Wed, 9 Nov 2022 15:53:50 -0500 Message-Id: <20221109205353.984745-16-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Add Hyperv-specific handling for faults caused by VMMCALL instructions. Signed-off-by: Tianyu Lan --- arch/x86/kernel/cpu/mshyperv.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index b266f648e5cd..a4e526378603 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -725,6 +725,20 @@ static bool __init ms_hyperv_msi_ext_dest_id(void) return eax & HYPERV_VS_PROPERTIES_EAX_EXTENDED_IOAPIC_RTE; } +static void hv_sev_es_hcall_prepare(struct ghcb *ghcb, struct pt_regs *regs) +{ + /* RAX and CPL are already in the GHCB */ + ghcb_set_rcx(ghcb, regs->cx); + ghcb_set_rdx(ghcb, regs->dx); + ghcb_set_r8(ghcb, regs->r8); +} + +static bool hv_sev_es_hcall_finish(struct ghcb *ghcb, struct pt_regs *regs) +{ + /* No checking of the return state needed */ + return true; +} + const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = { .name = "Microsoft Hyper-V", .detect = ms_hyperv_platform, @@ -732,4 +746,6 @@ const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = { .init.x2apic_available = ms_hyperv_x2apic_available, .init.msi_ext_dest_id = ms_hyperv_msi_ext_dest_id, .init.init_platform = ms_hyperv_init_platform, + .runtime.sev_es_hcall_prepare = hv_sev_es_hcall_prepare, + .runtime.sev_es_hcall_finish = hv_sev_es_hcall_finish, }; From patchwork Wed Nov 9 20:53:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038064 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 19429C433FE for ; Wed, 9 Nov 2022 20:55:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232093AbiKIUzN (ORCPT ); Wed, 9 Nov 2022 15:55:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49454 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231966AbiKIUyU (ORCPT ); Wed, 9 Nov 2022 15:54:20 -0500 Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1910F2BC8; Wed, 9 Nov 2022 12:54:19 -0800 (PST) Received: by mail-pl1-x630.google.com with SMTP id p12so12726867plq.4; Wed, 09 Nov 2022 12:54:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=W3ui10Pv987LOIJnXt9IMElhmcFERFnmwtjj/3DP9Vs=; b=cGZl10FbTRyEJiocNwyGxLyZYbjG/pr7b0v2WBuOTBNbML7GRrT6cCSv0ITuPo7CXU WRVWw+Q3WasXF7D9LHkFeKTl9TyHFX+bWHLAXw7j4yuBKMET3z8iPJ/V2JIbCFsjUdAk /tn/7uni27TlixQKi/kjmctzK6+vkBCrMC2lKktsy0kD1IAE7/R5b0EGQ4J5UCfnH+Kv n8D2FaGJokn3FyZ6tnA29OLMZDVTdUwqnkotXpQQiwC/ZbFZcr5RbJ2nmpPlZ3QGgzvP nlIBp6USVd42GK5JoZy/gVFAnRKyuB+z7u0oMwTh6Y5pVvfS+K36rn/R299L8r0ZzoUw 7gRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=W3ui10Pv987LOIJnXt9IMElhmcFERFnmwtjj/3DP9Vs=; b=t9IETTKr8SxDtW85FWu/jAgYkG6ccuZbgtrB/MfYMT3TmOh0DNHg5b7tJ86xdiitCh rTBwwONZDr9HugpbxW2VP3fYA9tZWLOvC4BKeh2M0vReATlpxS2at569zgRV9t67CrpJ JpxWD47LSGxL7GXpIV8mo+2d/PbC053nMkPAOcwjCiHg1GTN93BeRutg2PzssZFZHDX6 ly//+rew/TpQU5LdUcfd0jOiyjGhAmHse6nl97NhdAjYLezoISY/Pi8Ji0Qp83x8PsMI ziXsC1rAeiGhUc0hOQ6+Sa14kBSyyIg+ooB/F1ldhjTG2PA0HgqS0tLeFV3eiR4YBzj3 CJFw== X-Gm-Message-State: ANoB5pk3+epLy9gk3O+dh7LLERHVpRtxhTk5BFFv91Azf/HGIdc3BQ5V 2rEvx+6cGB1lKUA1vDobJ1o= X-Google-Smtp-Source: AA0mqf47zUsIHcK4N+Pv8uFjEaPpDd6j/uxySGyP4P7b4W6Kn9C0c+qeFbOF8SLVKUcgkeAFklMiQA== X-Received: by 2002:a17:902:708b:b0:188:853f:4dcd with SMTP id z11-20020a170902708b00b00188853f4dcdmr14835557plk.53.1668027258491; Wed, 09 Nov 2022 12:54:18 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:17 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 16/17] x86/sev: Add a #HV exception handler Date: Wed, 9 Nov 2022 15:53:51 -0500 Message-Id: <20221109205353.984745-17-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Add a #HV exception handler that uses IST stack. Signed-off-by: Tianyu Lan --- arch/x86/entry/entry_64.S | 58 ++++++++++++++++++++++++++ arch/x86/include/asm/cpu_entry_area.h | 6 +++ arch/x86/include/asm/idtentry.h | 39 +++++++++++++++++- arch/x86/include/asm/page_64_types.h | 1 + arch/x86/include/asm/trapnr.h | 1 + arch/x86/include/asm/traps.h | 1 + arch/x86/kernel/cpu/common.c | 1 + arch/x86/kernel/dumpstack_64.c | 9 +++- arch/x86/kernel/idt.c | 1 + arch/x86/kernel/sev.c | 59 +++++++++++++++++++++++++++ arch/x86/mm/cpu_entry_area.c | 2 + 11 files changed, 175 insertions(+), 3 deletions(-) diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index 9953d966d124..b2059df43c57 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -560,6 +560,64 @@ SYM_CODE_START(\asmsym) .Lfrom_usermode_switch_stack_\@: idtentry_body user_\cfunc, has_error_code=1 +_ASM_NOKPROBE(\asmsym) +SYM_CODE_END(\asmsym) +.endm +/* + * idtentry_hv - Macro to generate entry stub for #HV + * @vector: Vector number + * @asmsym: ASM symbol for the entry point + * @cfunc: C function to be called + * + * The macro emits code to set up the kernel context for #HV. The #HV handler + * runs on an IST stack and needs to be able to support nested #HV exceptions. + * + * To make this work the #HV entry code tries its best to pretend it doesn't use + * an IST stack by switching to the task stack if coming from user-space (which + * includes early SYSCALL entry path) or back to the stack in the IRET frame if + * entered from kernel-mode. + * + * If entered from kernel-mode the return stack is validated first, and if it is + * not safe to use (e.g. because it points to the entry stack) the #HV handler + * will switch to a fall-back stack (HV2) and call a special handler function. + * + * The macro is only used for one vector, but it is planned to be extended in + * the future for the #HV exception. + */ +.macro idtentry_hv vector asmsym cfunc +SYM_CODE_START(\asmsym) + UNWIND_HINT_IRET_REGS + ASM_CLAC + pushq $-1 /* ORIG_RAX: no syscall to restart */ + + testb $3, CS-ORIG_RAX(%rsp) + jnz .Lfrom_usermode_switch_stack_\@ + + call paranoid_entry + + UNWIND_HINT_REGS + + /* + * Switch off the IST stack to make it free for nested exceptions. + */ + movq %rsp, %rdi /* pt_regs pointer */ + call hv_switch_off_ist + movq %rax, %rsp /* Switch to new stack */ + + UNWIND_HINT_REGS + + /* Update pt_regs */ + movq ORIG_RAX(%rsp), %rsi /* get error code into 2nd argument*/ + movq $-1, ORIG_RAX(%rsp) /* no syscall to restart */ + + movq %rsp, %rdi /* pt_regs pointer */ + call kernel_\cfunc + + jmp paranoid_exit + +.Lfrom_usermode_switch_stack_\@: + idtentry_body user_\cfunc, has_error_code=1 + _ASM_NOKPROBE(\asmsym) SYM_CODE_END(\asmsym) .endm diff --git a/arch/x86/include/asm/cpu_entry_area.h b/arch/x86/include/asm/cpu_entry_area.h index 75efc4c6f076..f173a16cfc59 100644 --- a/arch/x86/include/asm/cpu_entry_area.h +++ b/arch/x86/include/asm/cpu_entry_area.h @@ -30,6 +30,10 @@ char VC_stack[optional_stack_size]; \ char VC2_stack_guard[guardsize]; \ char VC2_stack[optional_stack_size]; \ + char HV_stack_guard[guardsize]; \ + char HV_stack[optional_stack_size]; \ + char HV2_stack_guard[guardsize]; \ + char HV2_stack[optional_stack_size]; \ char IST_top_guard[guardsize]; \ /* The exception stacks' physical storage. No guard pages required */ @@ -52,6 +56,8 @@ enum exception_stack_ordering { ESTACK_MCE, ESTACK_VC, ESTACK_VC2, + ESTACK_HV, + ESTACK_HV2, N_EXCEPTION_STACKS }; diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h index 72184b0b2219..ed68acd6f723 100644 --- a/arch/x86/include/asm/idtentry.h +++ b/arch/x86/include/asm/idtentry.h @@ -317,6 +317,19 @@ static __always_inline void __##func(struct pt_regs *regs) __visible noinstr void kernel_##func(struct pt_regs *regs, unsigned long error_code); \ __visible noinstr void user_##func(struct pt_regs *regs, unsigned long error_code) + +/** + * DECLARE_IDTENTRY_HV - Declare functions for the HV entry point + * @vector: Vector number (ignored for C) + * @func: Function name of the entry point + * + * Maps to DECLARE_IDTENTRY_RAW, but declares also the user C handler. + */ +#define DECLARE_IDTENTRY_HV(vector, func) \ + DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func); \ + __visible noinstr void kernel_##func(struct pt_regs *regs, unsigned long error_code); \ + __visible noinstr void user_##func(struct pt_regs *regs, unsigned long error_code) + /** * DEFINE_IDTENTRY_IST - Emit code for IST entry points * @func: Function name of the entry point @@ -376,6 +389,26 @@ static __always_inline void __##func(struct pt_regs *regs) #define DEFINE_IDTENTRY_VC_USER(func) \ DEFINE_IDTENTRY_RAW_ERRORCODE(user_##func) +/** + * DEFINE_IDTENTRY_HV_KERNEL - Emit code for HV injection handler + * when raised from kernel mode + * @func: Function name of the entry point + * + * Maps to DEFINE_IDTENTRY_RAW + */ +#define DEFINE_IDTENTRY_HV_KERNEL(func) \ + DEFINE_IDTENTRY_RAW_ERRORCODE(kernel_##func) + +/** + * DEFINE_IDTENTRY_HV_USER - Emit code for HV injection handler + * when raised from user mode + * @func: Function name of the entry point + * + * Maps to DEFINE_IDTENTRY_RAW + */ +#define DEFINE_IDTENTRY_HV_USER(func) \ + DEFINE_IDTENTRY_RAW_ERRORCODE(user_##func) + #else /* CONFIG_X86_64 */ /** @@ -465,6 +498,9 @@ __visible noinstr void func(struct pt_regs *regs, \ # define DECLARE_IDTENTRY_VC(vector, func) \ idtentry_vc vector asm_##func func +# define DECLARE_IDTENTRY_HV(vector, func) \ + idtentry_hv vector asm_##func func + #else # define DECLARE_IDTENTRY_MCE(vector, func) \ DECLARE_IDTENTRY(vector, func) @@ -622,9 +658,10 @@ DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_DF, xenpv_exc_double_fault); DECLARE_IDTENTRY_ERRORCODE(X86_TRAP_CP, exc_control_protection); #endif -/* #VC */ +/* #VC & #HV */ #ifdef CONFIG_AMD_MEM_ENCRYPT DECLARE_IDTENTRY_VC(X86_TRAP_VC, exc_vmm_communication); +DECLARE_IDTENTRY_HV(X86_TRAP_HV, exc_hv_injection); #endif #ifdef CONFIG_XEN_PV diff --git a/arch/x86/include/asm/page_64_types.h b/arch/x86/include/asm/page_64_types.h index e9e2c3ba5923..0bd7dab676c5 100644 --- a/arch/x86/include/asm/page_64_types.h +++ b/arch/x86/include/asm/page_64_types.h @@ -29,6 +29,7 @@ #define IST_INDEX_DB 2 #define IST_INDEX_MCE 3 #define IST_INDEX_VC 4 +#define IST_INDEX_HV 5 /* * Set __PAGE_OFFSET to the most negative possible address + diff --git a/arch/x86/include/asm/trapnr.h b/arch/x86/include/asm/trapnr.h index f5d2325aa0b7..c6583631cecb 100644 --- a/arch/x86/include/asm/trapnr.h +++ b/arch/x86/include/asm/trapnr.h @@ -26,6 +26,7 @@ #define X86_TRAP_XF 19 /* SIMD Floating-Point Exception */ #define X86_TRAP_VE 20 /* Virtualization Exception */ #define X86_TRAP_CP 21 /* Control Protection Exception */ +#define X86_TRAP_HV 28 /* HV injected exception in SNP restricted mode */ #define X86_TRAP_VC 29 /* VMM Communication Exception */ #define X86_TRAP_IRET 32 /* IRET Exception */ diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h index 47ecfff2c83d..6795d3e517d6 100644 --- a/arch/x86/include/asm/traps.h +++ b/arch/x86/include/asm/traps.h @@ -16,6 +16,7 @@ asmlinkage __visible notrace struct pt_regs *fixup_bad_iret(struct pt_regs *bad_regs); void __init trap_init(void); asmlinkage __visible noinstr struct pt_regs *vc_switch_off_ist(struct pt_regs *eregs); +asmlinkage __visible noinstr struct pt_regs *hv_switch_off_ist(struct pt_regs *eregs); #endif extern bool ibt_selftest(void); diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 3e508f239098..87afa3a4c8b1 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -2165,6 +2165,7 @@ static inline void tss_setup_ist(struct tss_struct *tss) tss->x86_tss.ist[IST_INDEX_MCE] = __this_cpu_ist_top_va(MCE); /* Only mapped when SEV-ES is active */ tss->x86_tss.ist[IST_INDEX_VC] = __this_cpu_ist_top_va(VC); + tss->x86_tss.ist[IST_INDEX_HV] = __this_cpu_ist_top_va(HV); } #else /* CONFIG_X86_64 */ diff --git a/arch/x86/kernel/dumpstack_64.c b/arch/x86/kernel/dumpstack_64.c index 6c5defd6569a..23aa5912c87a 100644 --- a/arch/x86/kernel/dumpstack_64.c +++ b/arch/x86/kernel/dumpstack_64.c @@ -26,11 +26,14 @@ static const char * const exception_stack_names[] = { [ ESTACK_MCE ] = "#MC", [ ESTACK_VC ] = "#VC", [ ESTACK_VC2 ] = "#VC2", + [ ESTACK_HV ] = "#HV", + [ ESTACK_HV2 ] = "#HV2", + }; const char *stack_type_name(enum stack_type type) { - BUILD_BUG_ON(N_EXCEPTION_STACKS != 6); + BUILD_BUG_ON(N_EXCEPTION_STACKS != 8); if (type == STACK_TYPE_TASK) return "TASK"; @@ -89,6 +92,8 @@ struct estack_pages estack_pages[CEA_ESTACK_PAGES] ____cacheline_aligned = { EPAGERANGE(MCE), EPAGERANGE(VC), EPAGERANGE(VC2), + EPAGERANGE(HV), + EPAGERANGE(HV2), }; static __always_inline bool in_exception_stack(unsigned long *stack, struct stack_info *info) @@ -98,7 +103,7 @@ static __always_inline bool in_exception_stack(unsigned long *stack, struct stac struct pt_regs *regs; unsigned int k; - BUILD_BUG_ON(N_EXCEPTION_STACKS != 6); + BUILD_BUG_ON(N_EXCEPTION_STACKS != 8); begin = (unsigned long)__this_cpu_read(cea_exception_stacks); /* diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c index a58c6bc1cd68..48c0a7e1dbcb 100644 --- a/arch/x86/kernel/idt.c +++ b/arch/x86/kernel/idt.c @@ -113,6 +113,7 @@ static const __initconst struct idt_data def_idts[] = { #ifdef CONFIG_AMD_MEM_ENCRYPT ISTG(X86_TRAP_VC, asm_exc_vmm_communication, IST_INDEX_VC), + ISTG(X86_TRAP_HV, asm_exc_hv_injection, IST_INDEX_HV), #endif SYSG(X86_TRAP_OF, asm_exc_overflow), diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index a428c62330d3..63ddb043d16d 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -2004,6 +2004,65 @@ DEFINE_IDTENTRY_VC_USER(exc_vmm_communication) irqentry_exit_to_user_mode(regs); } +static bool hv_raw_handle_exception(struct pt_regs *regs) +{ + return false; +} + +static __always_inline bool on_hv_fallback_stack(struct pt_regs *regs) +{ + unsigned long sp = (unsigned long)regs; + + return (sp >= __this_cpu_ist_bottom_va(HV2) && sp < __this_cpu_ist_top_va(HV2)); +} + +DEFINE_IDTENTRY_HV_USER(exc_hv_injection) +{ + irqentry_enter_from_user_mode(regs); + instrumentation_begin(); + + if (!hv_raw_handle_exception(regs)) { + /* + * Do not kill the machine if user-space triggered the + * exception. Send SIGBUS instead and let user-space deal + * with it. + */ + force_sig_fault(SIGBUS, BUS_OBJERR, (void __user *)0); + } + + instrumentation_end(); + irqentry_exit_to_user_mode(regs); +} + +DEFINE_IDTENTRY_HV_KERNEL(exc_hv_injection) +{ + irqentry_state_t irq_state; + + if (unlikely(on_hv_fallback_stack(regs))) { + instrumentation_begin(); + panic("Can't handle #HV exception from unsupported context\n"); + instrumentation_end(); + } + + irq_state = irqentry_nmi_enter(regs); + instrumentation_begin(); + + if (!hv_raw_handle_exception(regs)) { + pr_emerg("PANIC: Unhandled #HV exception in kernel space\n"); + + /* Show some debug info */ + show_regs(regs); + + /* Ask hypervisor to sev_es_terminate */ + sev_es_terminate(SEV_TERM_SET_GEN, GHCB_SEV_ES_GEN_REQ); + + panic("Returned from Terminate-Request to Hypervisor\n"); + } + + instrumentation_end(); + irqentry_nmi_exit(regs, irq_state); +} + bool __init handle_vc_boot_ghcb(struct pt_regs *regs) { unsigned long exit_code = regs->orig_ax; diff --git a/arch/x86/mm/cpu_entry_area.c b/arch/x86/mm/cpu_entry_area.c index 6c2f1b76a0b6..608905dc6704 100644 --- a/arch/x86/mm/cpu_entry_area.c +++ b/arch/x86/mm/cpu_entry_area.c @@ -115,6 +115,8 @@ static void __init percpu_setup_exception_stacks(unsigned int cpu) if (cc_platform_has(CC_ATTR_GUEST_STATE_ENCRYPT)) { cea_map_stack(VC); cea_map_stack(VC2); + cea_map_stack(HV); + cea_map_stack(HV2); } } } From patchwork Wed Nov 9 20:53:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tianyu Lan X-Patchwork-Id: 13038065 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5CE26C43217 for ; Wed, 9 Nov 2022 20:55:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232007AbiKIUzP (ORCPT ); Wed, 9 Nov 2022 15:55:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49840 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231883AbiKIUyh (ORCPT ); Wed, 9 Nov 2022 15:54:37 -0500 Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7C22E3120C; Wed, 9 Nov 2022 12:54:20 -0800 (PST) Received: by mail-pl1-x62f.google.com with SMTP id v17so18240629plo.1; Wed, 09 Nov 2022 12:54:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=65yOPLfe/DFH9Ui4MHop44XuRa0prooc02CDBjHaLHw=; b=K4HHXzTsRTTiNIwK3BimmyIMN6QTIY7ewF5k0k33HH43w+N0NTCgSEu/7+HeVwvfE2 f/kwX2vZa/2eADx9Qss0DzwvWClXNVDIO3avyLGwZynl3qo1K54lBbB5ROF368Wc6IzI Vo/3czsh1drBs/QSmcihySXY2kccL56mHXt/7ZWa3y6ANpwPDbfwo4fMFX8n9ME378Gh QKD1TklbQtjl0OloaanhXdzMXH2MHgNOAstFCVJhcCZSHVfgbOALsY0rTyIT+WG5wg9h XNB984fZTwnQJFxEioUHwiwTgoIIkcOzDrZCxrV5jtIlC8e+85XN7dxtkHBgdJuTQRqE ihgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=65yOPLfe/DFH9Ui4MHop44XuRa0prooc02CDBjHaLHw=; b=dRhIGmDhpqb1TOPuNHL0iTWrwQXtYTirvffWz3YZ77QExdxBscSzagw7dES5FSa/GX yrOf8yBfptJkiXpsCIfshAttyyGqX5cfYOqDn+U2cx+M6KU26+5dxLzMuCVSc1VMvFkW 6GUmkvSyMRwxYKgEgYpAV+g86oWDQleSVZq4gYM1wt04W2wMGwiH7NvMhpXiS76REz0d PxPV8NdmGtCWox44TWR0KnMW5+QSy52AovBeKMJXw2Fmt5JUxtjKSsAUNdsUk19hxD5o JhL3hVak1kcMMen/Rd5qhRLjj6NzUwXy2py/cQK81C+lEuEuLTL8U0myepKouGWclFfo HqVg== X-Gm-Message-State: ACrzQf1aR64nN9t6V9yAeUJbAkXppEMclqiMsqwvk3LPXDgfy3kpGqoB iXkdOROVLLu+S2nJGf5zdfQ= X-Google-Smtp-Source: AMsMyM6d/nO03+pJx4ijKqNXJHD6y+zoYs3XLDQoqBZAboaCaV9fMbanBOXNK6JacCzAI7Bh+IBvjQ== X-Received: by 2002:a17:902:9a43:b0:188:5256:bf42 with SMTP id x3-20020a1709029a4300b001885256bf42mr35799651plv.69.1668027259836; Wed, 09 Nov 2022 12:54:19 -0800 (PST) Received: from ubuntu-Virtual-Machine.corp.microsoft.com ([2001:4898:80e8:a:c616:2003:6c97:8057]) by smtp.gmail.com with ESMTPSA id c2-20020a17090a108200b002137d3da760sm1633984pja.39.2022.11.09.12.54.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 09 Nov 2022 12:54:19 -0800 (PST) From: Tianyu Lan To: luto@kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, seanjc@google.com, pbonzini@redhat.com, jgross@suse.com, tiala@microsoft.com, kirill@shutemov.name, jiangshan.ljs@antgroup.com, peterz@infradead.org, ashish.kalra@amd.com, srutherford@google.com, akpm@linux-foundation.org, anshuman.khandual@arm.com, pawan.kumar.gupta@linux.intel.com, adrian.hunter@intel.com, daniel.sneddon@linux.intel.com, alexander.shishkin@linux.intel.com, sandipan.das@amd.com, ray.huang@amd.com, brijesh.singh@amd.com, michael.roth@amd.com, thomas.lendacky@amd.com, venu.busireddy@oracle.com, sterritt@google.com, tony.luck@intel.com, samitolvanen@google.com, fenghua.yu@intel.com Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org, linux-hyperv@vger.kernel.org, linux-arch@vger.kernel.org Subject: [RFC PATCH 17/17] x86/sev: Initialize #HV doorbell and handle interrupt requests Date: Wed, 9 Nov 2022 15:53:52 -0500 Message-Id: <20221109205353.984745-18-ltykernel@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221109205353.984745-1-ltykernel@gmail.com> References: <20221109205353.984745-1-ltykernel@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Tianyu Lan Enable #HV exception to handle interrupt requests from hypervisor. Signed-off-by: Tianyu Lan --- arch/x86/entry/entry_64.S | 18 ++ arch/x86/include/asm/irqflags.h | 19 ++ arch/x86/include/asm/mem_encrypt.h | 2 + arch/x86/include/asm/msr-index.h | 6 + arch/x86/include/uapi/asm/svm.h | 4 + arch/x86/kernel/sev.c | 327 ++++++++++++++++++++++++----- arch/x86/kernel/traps.c | 50 +++++ 7 files changed, 373 insertions(+), 53 deletions(-) diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index b2059df43c57..fe460cf44ab5 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -1058,6 +1058,15 @@ SYM_CODE_END(paranoid_entry) * R15 - old SPEC_CTRL */ SYM_CODE_START_LOCAL(paranoid_exit) +#ifdef CONFIG_AMD_MEM_ENCRYPT + /* + * If a #HV was delivered during execution and interrupts were + * disabled, then check if it can be handled before the iret + * (which may re-enable interrupts). + */ + mov %rsp, %rdi + call check_hv_pending +#endif UNWIND_HINT_REGS /* @@ -1183,6 +1192,15 @@ SYM_CODE_START_LOCAL(error_entry) SYM_CODE_END(error_entry) SYM_CODE_START_LOCAL(error_return) +#ifdef CONFIG_AMD_MEM_ENCRYPT + /* + * If a #HV was delivered during execution and interrupts were + * disabled, then check if it can be handled before the iret + * (which may re-enable interrupts). + */ + mov %rsp, %rdi + call check_hv_pending +#endif UNWIND_HINT_REGS DEBUG_ENTRY_ASSERT_IRQS_OFF testb $3, CS(%rsp) diff --git a/arch/x86/include/asm/irqflags.h b/arch/x86/include/asm/irqflags.h index 7793e52d6237..e0730d8bc0ac 100644 --- a/arch/x86/include/asm/irqflags.h +++ b/arch/x86/include/asm/irqflags.h @@ -14,6 +14,9 @@ /* * Interrupt control: */ +#ifdef CONFIG_AMD_MEM_ENCRYPT +void check_hv_pending(struct pt_regs *regs); +#endif /* Declaration required for gcc < 4.9 to prevent -Werror=missing-prototypes */ extern inline unsigned long native_save_fl(void); @@ -35,6 +38,19 @@ extern __always_inline unsigned long native_save_fl(void) return flags; } +extern inline void native_restore_fl(unsigned long flags) +{ + asm volatile("push %0 ; popf" + : /* no output */ + : "g" (flags) + : "memory", "cc"); +#ifdef CONFIG_AMD_MEM_ENCRYPT + if ((flags & X86_EFLAGS_IF)) { + check_hv_pending(NULL); + } +#endif +} + static __always_inline void native_irq_disable(void) { asm volatile("cli": : :"memory"); @@ -43,6 +59,9 @@ static __always_inline void native_irq_disable(void) static __always_inline void native_irq_enable(void) { asm volatile("sti": : :"memory"); +#ifdef CONFIG_AMD_MEM_ENCRYPT + check_hv_pending(NULL); +#endif } static inline __cpuidle void native_safe_halt(void) diff --git a/arch/x86/include/asm/mem_encrypt.h b/arch/x86/include/asm/mem_encrypt.h index 72ca90552b6a..7264ca5f5b2d 100644 --- a/arch/x86/include/asm/mem_encrypt.h +++ b/arch/x86/include/asm/mem_encrypt.h @@ -50,6 +50,7 @@ void __init early_set_mem_enc_dec_hypercall(unsigned long vaddr, int npages, void __init mem_encrypt_free_decrypted_mem(void); void __init sev_es_init_vc_handling(void); +void __init sev_snp_init_hv_handling(void); #define __bss_decrypted __section(".bss..decrypted") @@ -72,6 +73,7 @@ static inline void __init sme_encrypt_kernel(struct boot_params *bp) { } static inline void __init sme_enable(struct boot_params *bp) { } static inline void sev_es_init_vc_handling(void) { } +static inline void sev_snp_init_hv_handling(void) { } static inline int __init early_set_memory_decrypted(unsigned long vaddr, unsigned long size) { return 0; } diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 10ac52705892..6fe25a6e325f 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -562,10 +562,16 @@ #define MSR_AMD64_SEV_ENABLED_BIT 0 #define MSR_AMD64_SEV_ES_ENABLED_BIT 1 #define MSR_AMD64_SEV_SNP_ENABLED_BIT 2 +#define MSR_AMD64_SEV_REFLECTVC_ENABLED_BIT 4 +#define MSR_AMD64_SEV_RESTRICTED_INJECTION_ENABLED_BIT 5 +#define MSR_AMD64_SEV_ALTERNATE_INJECTION_ENABLED_BIT 6 #define MSR_AMD64_SEV_ENABLED BIT_ULL(MSR_AMD64_SEV_ENABLED_BIT) #define MSR_AMD64_SEV_ES_ENABLED BIT_ULL(MSR_AMD64_SEV_ES_ENABLED_BIT) #define MSR_AMD64_SEV_SNP_ENABLED BIT_ULL(MSR_AMD64_SEV_SNP_ENABLED_BIT) +#define MSR_AMD64_SEV_REFLECTVC_ENABLED BIT_ULL(MSR_AMD64_SEV_REFLECTVC_ENABLED_BIT) +#define MSR_AMD64_SEV_RESTRICTED_INJECTION_ENABLED BIT_ULL(MSR_AMD64_SEV_RESTRICTED_INJECTION_ENABLED_BIT) +#define MSR_AMD64_SEV_ALTERNATE_INJECTION_ENABLED BIT_ULL(MSR_AMD64_SEV_ALTERNATE_INJECTION_ENABLED_BIT) #define MSR_AMD64_VIRT_SPEC_CTRL 0xc001011f /* AMD Collaborative Processor Performance Control MSRs */ diff --git a/arch/x86/include/uapi/asm/svm.h b/arch/x86/include/uapi/asm/svm.h index f69c168391aa..85d6882262e7 100644 --- a/arch/x86/include/uapi/asm/svm.h +++ b/arch/x86/include/uapi/asm/svm.h @@ -115,6 +115,10 @@ #define SVM_VMGEXIT_AP_CREATE_ON_INIT 0 #define SVM_VMGEXIT_AP_CREATE 1 #define SVM_VMGEXIT_AP_DESTROY 2 +#define SVM_VMGEXIT_HV_DOORBELL_PAGE 0x80000014 +#define SVM_VMGEXIT_GET_PREFERRED_HV_DOORBELL_PAGE 0 +#define SVM_VMGEXIT_SET_HV_DOORBELL_PAGE 1 +#define SVM_VMGEXIT_QUERY_HV_DOORBELL_PAGE 2 #define SVM_VMGEXIT_HV_FEATURES 0x8000fffd #define SVM_VMGEXIT_UNSUPPORTED_EVENT 0x8000ffff diff --git a/arch/x86/kernel/sev.c b/arch/x86/kernel/sev.c index 63ddb043d16d..65eb9f96d0c4 100644 --- a/arch/x86/kernel/sev.c +++ b/arch/x86/kernel/sev.c @@ -104,6 +104,12 @@ struct sev_es_runtime_data { * is currently unsupported in SEV-ES guests. */ unsigned long dr7; + /* + * SEV-SNP requires that the GHCB must be registered before using it. + * The flag below will indicate whether the GHCB is registered, if its + * not registered then sev_es_get_ghcb() will perform the registration. + */ + bool ghcb_registered; }; struct ghcb_state { @@ -122,6 +128,156 @@ struct sev_config { static struct sev_config sev_cfg __read_mostly; +static noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state); +static noinstr void __sev_put_ghcb(struct ghcb_state *state); +static int vmgexit_hv_doorbell_page(struct ghcb *ghcb, u64 op, u64 pa); +static void sev_snp_setup_hv_doorbell_page(struct ghcb *ghcb); + +struct sev_hv_doorbell_page { + union { + u16 pending_events; + struct { + u8 vector; + u8 nmi : 1; + u8 mc : 1; + u8 reserved1 : 5; + u8 no_further_signal : 1; + }; + }; + u8 no_eoi_required; + u8 reserved2[61]; + u8 padding[4032]; +}; + +struct sev_snp_runtime_data { + struct sev_hv_doorbell_page hv_doorbell_page; +}; + +static DEFINE_PER_CPU(struct sev_snp_runtime_data*, snp_runtime_data); + +static inline u64 sev_es_rd_ghcb_msr(void) +{ + return __rdmsr(MSR_AMD64_SEV_ES_GHCB); +} + +static __always_inline void sev_es_wr_ghcb_msr(u64 val) +{ + u32 low, high; + + low = (u32)(val); + high = (u32)(val >> 32); + + native_wrmsr(MSR_AMD64_SEV_ES_GHCB, low, high); +} + +struct sev_hv_doorbell_page *sev_snp_current_doorbell_page(void) +{ + return &this_cpu_read(snp_runtime_data)->hv_doorbell_page; +} + +static u8 sev_hv_pending(void) +{ + return sev_snp_current_doorbell_page()->vector; +} + +static void hv_doorbell_apic_eoi_write(u32 reg, u32 val) +{ + if (xchg(&sev_snp_current_doorbell_page()->no_eoi_required, 0) & 0x1) + return; + + BUG_ON(reg != APIC_EOI); + apic->write(reg, val); +} + +static void do_exc_hv(struct pt_regs *regs) +{ + u8 vector; + + while (sev_hv_pending()) { + asm volatile("cli" : : : "memory"); + + vector = xchg(&sev_snp_current_doorbell_page()->vector, 0); + + switch (vector) { +#if IS_ENABLED(CONFIG_HYPERV) + case HYPERV_STIMER0_VECTOR: + sysvec_hyperv_stimer0(regs); + break; + case HYPERVISOR_CALLBACK_VECTOR: + sysvec_hyperv_callback(regs); + break; +#endif +#ifdef CONFIG_SMP + case RESCHEDULE_VECTOR: + sysvec_reschedule_ipi(regs); + break; + case IRQ_MOVE_CLEANUP_VECTOR: + sysvec_irq_move_cleanup(regs); + break; + case REBOOT_VECTOR: + sysvec_reboot(regs); + break; + case CALL_FUNCTION_SINGLE_VECTOR: + sysvec_call_function_single(regs); + break; + case CALL_FUNCTION_VECTOR: + sysvec_call_function(regs); + break; +#endif +#ifdef CONFIG_X86_LOCAL_APIC + case ERROR_APIC_VECTOR: + sysvec_error_interrupt(regs); + break; + case SPURIOUS_APIC_VECTOR: + sysvec_spurious_apic_interrupt(regs); + break; + case LOCAL_TIMER_VECTOR: + sysvec_apic_timer_interrupt(regs); + break; + case X86_PLATFORM_IPI_VECTOR: + sysvec_x86_platform_ipi(regs); + break; +#endif + case 0x0: + break; + default: + panic("Unexpected vector %d\n", vector); + unreachable(); + } + + asm volatile("sti" : : : "memory"); + } +} + +void check_hv_pending(struct pt_regs *regs) +{ + struct pt_regs local_regs; + + if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) + return; + + if (regs) { + if ((regs->flags & X86_EFLAGS_IF) == 0) + return; + + if (!sev_hv_pending()) + return; + + do_exc_hv(regs); + } else { + if (sev_hv_pending()) { + memset(&local_regs, 0, sizeof(struct pt_regs)); + regs = &local_regs; + asm volatile("movl %%cs, %%eax;" : "=a" (regs->cs)); + asm volatile("movl %%ss, %%eax;" : "=a" (regs->ss)); + regs->orig_ax = 0xffffffff; + regs->flags = native_save_fl(); + do_exc_hv(regs); + } + } +} +EXPORT_SYMBOL_GPL(check_hv_pending); + static __always_inline bool on_vc_stack(struct pt_regs *regs) { unsigned long sp = regs->sp; @@ -193,68 +349,35 @@ void noinstr __sev_es_ist_exit(void) this_cpu_write(cpu_tss_rw.x86_tss.ist[IST_INDEX_VC], *(unsigned long *)ist); } -/* - * Nothing shall interrupt this code path while holding the per-CPU - * GHCB. The backup GHCB is only for NMIs interrupting this path. - * - * Callers must disable local interrupts around it. - */ -static noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state) +static bool sev_restricted_injection_enabled(void) { - struct sev_es_runtime_data *data; + return sev_status & MSR_AMD64_SEV_RESTRICTED_INJECTION_ENABLED; +} + +void __init sev_snp_init_hv_handling(void) +{ + struct sev_snp_runtime_data *snp_data; + struct ghcb_state state; struct ghcb *ghcb; + unsigned long flags; + int cpu; + int err; WARN_ON(!irqs_disabled()); + if (!cc_platform_has(CC_ATTR_GUEST_SEV_SNP) || !sev_restricted_injection_enabled()) + return; - data = this_cpu_read(runtime_data); - ghcb = &data->ghcb_page; - - if (unlikely(data->ghcb_active)) { - /* GHCB is already in use - save its contents */ - - if (unlikely(data->backup_ghcb_active)) { - /* - * Backup-GHCB is also already in use. There is no way - * to continue here so just kill the machine. To make - * panic() work, mark GHCBs inactive so that messages - * can be printed out. - */ - data->ghcb_active = false; - data->backup_ghcb_active = false; - - instrumentation_begin(); - panic("Unable to handle #VC exception! GHCB and Backup GHCB are already in use"); - instrumentation_end(); - } - - /* Mark backup_ghcb active before writing to it */ - data->backup_ghcb_active = true; - - state->ghcb = &data->backup_ghcb; - - /* Backup GHCB content */ - *state->ghcb = *ghcb; - } else { - state->ghcb = NULL; - data->ghcb_active = true; - } + local_irq_save(flags); - return ghcb; -} + ghcb = __sev_get_ghcb(&state); -static inline u64 sev_es_rd_ghcb_msr(void) -{ - return __rdmsr(MSR_AMD64_SEV_ES_GHCB); -} + sev_snp_setup_hv_doorbell_page(ghcb); -static __always_inline void sev_es_wr_ghcb_msr(u64 val) -{ - u32 low, high; + __sev_put_ghcb(&state); - low = (u32)(val); - high = (u32)(val >> 32); + apic_set_eoi_write(hv_doorbell_apic_eoi_write); - native_wrmsr(MSR_AMD64_SEV_ES_GHCB, low, high); + local_irq_restore(flags); } static int vc_fetch_insn_kernel(struct es_em_ctxt *ctxt, @@ -515,6 +638,79 @@ static enum es_result vc_slow_virt_to_phys(struct ghcb *ghcb, struct es_em_ctxt /* Include code shared with pre-decompression boot stage */ #include "sev-shared.c" +/* + * Nothing shall interrupt this code path while holding the per-CPU + * GHCB. The backup GHCB is only for NMIs interrupting this path. + * + * Callers must disable local interrupts around it. + */ +static noinstr struct ghcb *__sev_get_ghcb(struct ghcb_state *state) +{ + struct sev_es_runtime_data *data; + struct ghcb *ghcb; + + WARN_ON(!irqs_disabled()); + + data = this_cpu_read(runtime_data); + ghcb = &data->ghcb_page; + + if (unlikely(data->ghcb_active)) { + /* GHCB is already in use - save its contents */ + + if (unlikely(data->backup_ghcb_active)) { + /* + * Backup-GHCB is also already in use. There is no way + * to continue here so just kill the machine. To make + * panic() work, mark GHCBs inactive so that messages + * can be printed out. + */ + data->ghcb_active = false; + data->backup_ghcb_active = false; + + instrumentation_begin(); + panic("Unable to handle #VC exception! GHCB and Backup GHCB are already in use"); + instrumentation_end(); + } + + /* Mark backup_ghcb active before writing to it */ + data->backup_ghcb_active = true; + + state->ghcb = &data->backup_ghcb; + + /* Backup GHCB content */ + *state->ghcb = *ghcb; + } else { + state->ghcb = NULL; + data->ghcb_active = true; + } + + /* SEV-SNP guest requires that GHCB must be registered before using it. */ + if (!data->ghcb_registered) { + if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) { + snp_register_ghcb_early(__pa(ghcb)); + sev_snp_setup_hv_doorbell_page(ghcb); + } else { + sev_es_wr_ghcb_msr(__pa(ghcb)); + } + data->ghcb_registered = true; + } + + return ghcb; +} + +static void sev_snp_setup_hv_doorbell_page(struct ghcb *ghcb) +{ + u64 pa; + enum es_result ret; + + pa = __pa(sev_snp_current_doorbell_page()); + vc_ghcb_invalidate(ghcb); + ret = vmgexit_hv_doorbell_page(ghcb, + SVM_VMGEXIT_SET_HV_DOORBELL_PAGE, pa); + if (ret != ES_OK) + panic("SEV-SNP: failed to set up #HV doorbell page"); +} + static noinstr void __sev_put_ghcb(struct ghcb_state *state) { struct sev_es_runtime_data *data; @@ -1282,6 +1478,11 @@ void setup_ghcb(void) snp_register_ghcb_early(__pa(&boot_ghcb_page)); } +int vmgexit_hv_doorbell_page(struct ghcb *ghcb, u64 op, u64 pa) +{ + return sev_es_ghcb_hv_call(ghcb, NULL, SVM_VMGEXIT_HV_DOORBELL_PAGE, op, pa); +} + #ifdef CONFIG_HOTPLUG_CPU static void sev_es_ap_hlt_loop(void) { @@ -1355,6 +1556,7 @@ static void __init alloc_runtime_data(int cpu) static void __init init_ghcb(int cpu) { struct sev_es_runtime_data *data; + struct sev_snp_runtime_data *snp_data; int err; data = per_cpu(runtime_data, cpu); @@ -1366,8 +1568,22 @@ static void __init init_ghcb(int cpu) memset(&data->ghcb_page, 0, sizeof(data->ghcb_page)); + snp_data = memblock_alloc(sizeof(*snp_data), PAGE_SIZE); + if (!snp_data) + panic("Can't allocate SEV-SNP runtime data"); + + err = early_set_memory_decrypted((unsigned long)&snp_data->hv_doorbell_page, + sizeof(snp_data->hv_doorbell_page)); + if (err) + panic("Can't map #HV doorbell pages unencrypted"); + + memset(&snp_data->hv_doorbell_page, 0, sizeof(snp_data->hv_doorbell_page)); + + per_cpu(snp_runtime_data, cpu) = snp_data; + data->ghcb_active = false; data->backup_ghcb_active = false; + data->ghcb_registered = false; } void __init sev_es_init_vc_handling(void) @@ -2006,7 +2222,12 @@ DEFINE_IDTENTRY_VC_USER(exc_vmm_communication) static bool hv_raw_handle_exception(struct pt_regs *regs) { - return false; + /* Clear the no_further_signal bit */ + sev_snp_current_doorbell_page()->pending_events &= 0x7fff; + + check_hv_pending(regs); + + return true; } static __always_inline bool on_hv_fallback_stack(struct pt_regs *regs) diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 178015a820f0..af97e6610fbb 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -898,6 +898,53 @@ asmlinkage __visible noinstr struct pt_regs *vc_switch_off_ist(struct pt_regs *r return regs_ret; } + +asmlinkage __visible noinstr struct pt_regs *hv_switch_off_ist(struct pt_regs *regs) +{ + unsigned long sp, *stack; + struct stack_info info; + struct pt_regs *regs_ret; + + /* + * A malicious hypervisor can inject 2 HVs in a row, which will corrupt + * the trap frame on our IST stack. We add a defensive check here to + * catch such behavior. + */ + BUG_ON(regs->sp >= __this_cpu_ist_bottom_va(HV) && regs->sp < __this_cpu_ist_top_va(HV)); + + /* + * In the SYSCALL entry path the RSP value comes from user-space - don't + * trust it and switch to the current kernel stack + */ + if (ip_within_syscall_gap(regs)) { + sp = this_cpu_read(cpu_current_top_of_stack); + goto sync; + } + + /* + * From here on the RSP value is trusted. Now check whether entry + * happened from a safe stack. Not safe are the entry or unknown stacks, + * use the fall-back stack instead in this case. + */ + sp = regs->sp; + stack = (unsigned long *)sp; + + if (!get_stack_info_noinstr(stack, current, &info) || info.type == STACK_TYPE_ENTRY || + info.type > STACK_TYPE_EXCEPTION_LAST) + sp = __this_cpu_ist_top_va(HV2); +sync: + /* + * Found a safe stack - switch to it as if the entry didn't happen via + * IST stack. The code below only copies pt_regs, the real switch happens + * in assembly code. + */ + sp = ALIGN_DOWN(sp, 8) - sizeof(*regs_ret); + + regs_ret = (struct pt_regs *)sp; + *regs_ret = *regs; + + return regs_ret; +} #endif asmlinkage __visible noinstr struct pt_regs *fixup_bad_iret(struct pt_regs *bad_regs) @@ -1457,4 +1504,7 @@ void __init trap_init(void) /* Setup traps as cpu_init() might #GP */ idt_setup_traps(); cpu_init(); + + /* Init #HV doorbell pages when running as an SEV-SNP guest */ + sev_snp_init_hv_handling(); }