Received: by 2002:a05:6520:2586:b029:fa:41f3:c225 with SMTP id u6csp29338lky; Wed, 9 Jun 2021 14:57:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqmrWK37mu1RrT7ovKOzba+tkKQa37SEMtatbh/rYzj7i/83EX9HVG8vvCy/WJG3aWedsB X-Received: by 2002:a17:906:dfd1:: with SMTP id jt17mr1686136ejc.486.1623275834402; Wed, 09 Jun 2021 14:57:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623275834; cv=none; d=google.com; s=arc-20160816; b=mW9H+EzdhgmXqTaVmIGLV3osI3lPkMZwFUr5RytE7UsxDVqsJa2paINoefMpeMlEGp JyjmoSGEnZ9f8TUMApH/NC/8Y4O1DL3a8Kf94rVBZx02IcBO+48kQqBBJ4UKiTMKCkFs zAkF6nE34jw8UJ0z3OvfOR8+CNZOvy01jUSicki7wqtJQP7YcVHWNwy6nnQ+U95vWtOs w1HrZADE4F3LvnDKeqxir/PkEtyHoAI+IzM71rbdWxb+M5/+JspZA/iLcvvUUaoUlsEF fulZHQWmXHV3tEw7B09GbjutBKKiTyfuqYJ6q5OiHowCbQ7W0EUB+dQ2vMEu8OltCOei cU8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=S5CJScKs7UcfrthTWo9Yb8LKou4iVjgR0mHdqO2jZMc=; b=rj9iAx7FQU8guE47KqrVQXerUsH/XD0LS6NfabcKJhlCOwU8/A4uzDuLx2lSrhAagp 68A8pOOL8TIs2q52sbaKJnmY1qXem9zV8phf5QlHvU3kkbrDHcubFFaGx+mueXq7mnim QdQeDZ1grszRP8kqmBsZI4ZnVpgkFtv0yyX5A6bc/VoOTUcAmXzJt0WbObeT7qV9c19M SCsT+AdVsSYZ8Kee84ly3XMMkpB/eW1NXw6t3vzx2ebjLTPj1jheQJu2gXilkQno5EDH Axvp1yzwTpTt3wqLkDY1ZJCZvbBiMajzA+/HbDXhggfhdcyZ59BUHTa+wDM+s19smYcE 7hgg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hc43si862911ejc.513.2021.06.09.14.56.50; Wed, 09 Jun 2021 14:57:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229941AbhFIV5o (ORCPT + 99 others); Wed, 9 Jun 2021 17:57:44 -0400 Received: from mga03.intel.com ([134.134.136.65]:1779 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229782AbhFIV5n (ORCPT ); Wed, 9 Jun 2021 17:57:43 -0400 IronPort-SDR: /ltOot0OMftvMiCQumT9G89phkfY5u0hMpW4tYhiasKiUJHasLz2+G3PcaZTB1bAkyRnxB7ert xPOZWr4Rezug== X-IronPort-AV: E=McAfee;i="6200,9189,10010"; a="205208539" X-IronPort-AV: E=Sophos;i="5.83,261,1616482800"; d="scan'208";a="205208539" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2021 14:55:48 -0700 IronPort-SDR: 0KXUcpfCJGGjPbrNTPJ7W9HmdSj0TfnAyYlgI57gQQSjm+9RNsYebfQgDm0Fyid9O9at9pgN7U +UcItsrhZGqg== X-IronPort-AV: E=Sophos;i="5.83,261,1616482800"; d="scan'208";a="482555063" Received: from qwang4-mobl1.ccr.corp.intel.com (HELO skuppusw-desk1.amr.corp.intel.com) ([10.254.35.228]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jun 2021 14:55:47 -0700 From: Kuppuswamy Sathyanarayanan To: Thomas Gleixner , Ingo Molnar , Borislav Petkov , Peter Zijlstra , Andy Lutomirski Cc: Peter H Anvin , Dave Hansen , Tony Luck , Dan Williams , Andi Kleen , Kirill Shutemov , Sean Christopherson , Kuppuswamy Sathyanarayanan , x86@kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v1 1/7] x86/mm: Move force_dma_unencrypted() to common code Date: Wed, 9 Jun 2021 14:55:31 -0700 Message-Id: <20210609215537.1956150-2-sathyanarayanan.kuppuswamy@linux.intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210609215537.1956150-1-sathyanarayanan.kuppuswamy@linux.intel.com> References: <20210609215537.1956150-1-sathyanarayanan.kuppuswamy@linux.intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Kirill A. Shutemov" Intel TDX doesn't allow VMM to access guest private memory. Any memory that is required for communication with VMM must be shared explicitly by setting the bit in page table entry. After setting the shared bit, the conversion must be completed with MapGPA hypercall. You can find details about MapGPA hypercall in [1], sec 3.2. The call informs VMM about the conversion between private/shared mappings. The shared memory is similar to unencrypted memory in AMD SME/SEV terminology but the underlying process of sharing/un-sharing the memory is different for Intel TDX guest platform. SEV assumes that I/O devices can only do DMA to "decrypted" physical addresses without the C-bit set. In order for the CPU to interact with this memory, the CPU needs a decrypted mapping. To add this support, AMD SME code forces force_dma_unencrypted() to return true for platforms that support AMD SEV feature. It will be used for DMA memory allocation API to trigger set_memory_decrypted() for platforms that support AMD SEV feature. TDX is similar. So, to communicate with I/O devices, related pages need to be marked as shared. As mentioned above, shared memory in TDX architecture is similar to decrypted memory in AMD SME/SEV. So similar to AMD SEV, force_dma_unencrypted() has to forced to return true. This support is added in other patches in this series. So move force_dma_unencrypted() out of AMD specific code and call AMD specific (amd_force_dma_unencrypted()) initialization function from it. force_dma_unencrypted() will be modified by later patches to include Intel TDX guest platform specific initialization. Also, introduce new config option X86_MEM_ENCRYPT_COMMON that has to be selected by all x86 memory encryption features. This will be selected by both AMD SEV and Intel TDX guest config options. This is preparation for TDX changes in DMA code and it has no functional change. [1] - https://software.intel.com/content/dam/develop/external/us/en/documents/intel-tdx-guest-hypervisor-communication-interface.pdf Signed-off-by: Kirill A. Shutemov Reviewed-by: Andi Kleen Reviewed-by: Tony Luck Signed-off-by: Kuppuswamy Sathyanarayanan --- arch/x86/Kconfig | 8 ++++++-- arch/x86/include/asm/mem_encrypt_common.h | 18 ++++++++++++++++++ arch/x86/mm/Makefile | 2 ++ arch/x86/mm/mem_encrypt.c | 5 +++-- arch/x86/mm/mem_encrypt_common.c | 20 ++++++++++++++++++++ 5 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 arch/x86/include/asm/mem_encrypt_common.h create mode 100644 arch/x86/mm/mem_encrypt_common.c diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index fc51579e54ad..2adc0df1838b 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1536,16 +1536,20 @@ config X86_CPA_STATISTICS helps to determine the effectiveness of preserving large and huge page mappings when mapping protections are changed. +config X86_MEM_ENCRYPT_COMMON + select ARCH_HAS_FORCE_DMA_UNENCRYPTED + select DYNAMIC_PHYSICAL_MASK + def_bool n + config AMD_MEM_ENCRYPT bool "AMD Secure Memory Encryption (SME) support" depends on X86_64 && CPU_SUP_AMD select DMA_COHERENT_POOL - select DYNAMIC_PHYSICAL_MASK select ARCH_USE_MEMREMAP_PROT - select ARCH_HAS_FORCE_DMA_UNENCRYPTED select INSTRUCTION_DECODER select ARCH_HAS_RESTRICTED_VIRTIO_MEMORY_ACCESS select ARCH_HAS_PROTECTED_GUEST + select X86_MEM_ENCRYPT_COMMON help Say yes to enable support for the encryption of system memory. This requires an AMD processor that supports Secure Memory diff --git a/arch/x86/include/asm/mem_encrypt_common.h b/arch/x86/include/asm/mem_encrypt_common.h new file mode 100644 index 000000000000..697bc40a4e3d --- /dev/null +++ b/arch/x86/include/asm/mem_encrypt_common.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (C) 2020 Intel Corporation */ +#ifndef _ASM_X86_MEM_ENCRYPT_COMMON_H +#define _ASM_X86_MEM_ENCRYPT_COMMON_H + +#include +#include + +#ifdef CONFIG_AMD_MEM_ENCRYPT +bool amd_force_dma_unencrypted(struct device *dev); +#else /* CONFIG_AMD_MEM_ENCRYPT */ +static inline bool amd_force_dma_unencrypted(struct device *dev) +{ + return false; +} +#endif /* CONFIG_AMD_MEM_ENCRYPT */ + +#endif diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index 5864219221ca..b31cb52bf1bd 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile @@ -52,6 +52,8 @@ obj-$(CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS) += pkeys.o obj-$(CONFIG_RANDOMIZE_MEMORY) += kaslr.o obj-$(CONFIG_PAGE_TABLE_ISOLATION) += pti.o +obj-$(CONFIG_X86_MEM_ENCRYPT_COMMON) += mem_encrypt_common.o + obj-$(CONFIG_AMD_MEM_ENCRYPT) += mem_encrypt.o obj-$(CONFIG_AMD_MEM_ENCRYPT) += mem_encrypt_identity.o obj-$(CONFIG_AMD_MEM_ENCRYPT) += mem_encrypt_boot.o diff --git a/arch/x86/mm/mem_encrypt.c b/arch/x86/mm/mem_encrypt.c index d0026bce47df..9c55a3209c88 100644 --- a/arch/x86/mm/mem_encrypt.c +++ b/arch/x86/mm/mem_encrypt.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "mm_internal.h" @@ -390,8 +391,8 @@ bool noinstr sev_es_active(void) return sev_status & MSR_AMD64_SEV_ES_ENABLED; } -/* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */ -bool force_dma_unencrypted(struct device *dev) +/* Override for DMA direct allocation check - AMD specific initialization */ +bool amd_force_dma_unencrypted(struct device *dev) { /* * For SEV, all DMA must be to unencrypted addresses. diff --git a/arch/x86/mm/mem_encrypt_common.c b/arch/x86/mm/mem_encrypt_common.c new file mode 100644 index 000000000000..4a9a4d5f36cd --- /dev/null +++ b/arch/x86/mm/mem_encrypt_common.c @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Memory Encryption Support Common Code + * + * Copyright (C) 2021 Intel Corporation + * + * Author: Kuppuswamy Sathyanarayanan + */ + +#include +#include + +/* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */ +bool force_dma_unencrypted(struct device *dev) +{ + if (sev_active() || sme_active()) + return amd_force_dma_unencrypted(dev); + + return false; +} -- 2.25.1