-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
x86/sev: Move common memory encryption code to mem_encrypt.c
SEV and TDX both protect guest memory from host accesses. They both use guest physical address bits to communicate to the hardware which pages receive protection or not. SEV and TDX both assume that all I/O (real devices and virtio) must be performed to pages *without* protection. To add this support, AMD SEV code forces force_dma_unencrypted() to decrypt DMA pages when DMA pages were allocated for I/O. It also uses swiotlb_update_mem_attributes() to update decryption bits in SWIOTLB DMA buffers. Since TDX also uses a similar memory sharing design, all the above mentioned changes can be reused. So move force_dma_unencrypted(), SWIOTLB update code and virtio changes out of mem_encrypt_amd.c to mem_encrypt.c. Introduce a new config option X86_MEM_ENCRYPT that can be selected by platforms which use x86 memory encryption features (needed in both AMD SEV and Intel TDX guest platforms). Since the code is moved from mem_encrypt_amd.c, inherit the same make flags. This is preparation for enabling TDX memory encryption support and it has no functional changes. Co-developed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Signed-off-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com> Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Signed-off-by: Borislav Petkov <bp@suse.de> Reviewed-by: Andi Kleen <ak@linux.intel.com> Reviewed-by: Tony Luck <tony.luck@intel.com> Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> Tested-by: Tom Lendacky <thomas.lendacky@amd.com> Link: https://lore.kernel.org/r/20211206135505.75045-4-kirill.shutemov@linux.intel.com
- Loading branch information
Kirill A. Shutemov
authored and
Borislav Petkov
committed
Dec 8, 2021
1 parent
dbca5e1
commit 20f07a0
Showing
4 changed files
with
96 additions
and
72 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Memory Encryption Support Common Code | ||
* | ||
* Copyright (C) 2016 Advanced Micro Devices, Inc. | ||
* | ||
* Author: Tom Lendacky <thomas.lendacky@amd.com> | ||
*/ | ||
|
||
#include <linux/dma-direct.h> | ||
#include <linux/dma-mapping.h> | ||
#include <linux/swiotlb.h> | ||
#include <linux/cc_platform.h> | ||
#include <linux/mem_encrypt.h> | ||
#include <linux/virtio_config.h> | ||
|
||
/* Override for DMA direct allocation check - ARCH_HAS_FORCE_DMA_UNENCRYPTED */ | ||
bool force_dma_unencrypted(struct device *dev) | ||
{ | ||
/* | ||
* For SEV, all DMA must be to unencrypted addresses. | ||
*/ | ||
if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) | ||
return true; | ||
|
||
/* | ||
* For SME, all DMA must be to unencrypted addresses if the | ||
* device does not support DMA to addresses that include the | ||
* encryption mask. | ||
*/ | ||
if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) { | ||
u64 dma_enc_mask = DMA_BIT_MASK(__ffs64(sme_me_mask)); | ||
u64 dma_dev_mask = min_not_zero(dev->coherent_dma_mask, | ||
dev->bus_dma_limit); | ||
|
||
if (dma_dev_mask <= dma_enc_mask) | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
static void print_mem_encrypt_feature_info(void) | ||
{ | ||
pr_info("AMD Memory Encryption Features active:"); | ||
|
||
/* Secure Memory Encryption */ | ||
if (cc_platform_has(CC_ATTR_HOST_MEM_ENCRYPT)) { | ||
/* | ||
* SME is mutually exclusive with any of the SEV | ||
* features below. | ||
*/ | ||
pr_cont(" SME\n"); | ||
return; | ||
} | ||
|
||
/* Secure Encrypted Virtualization */ | ||
if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT)) | ||
pr_cont(" SEV"); | ||
|
||
/* Encrypted Register State */ | ||
if (cc_platform_has(CC_ATTR_GUEST_STATE_ENCRYPT)) | ||
pr_cont(" SEV-ES"); | ||
|
||
pr_cont("\n"); | ||
} | ||
|
||
/* Architecture __weak replacement functions */ | ||
void __init mem_encrypt_init(void) | ||
{ | ||
if (!cc_platform_has(CC_ATTR_MEM_ENCRYPT)) | ||
return; | ||
|
||
/* Call into SWIOTLB to update the SWIOTLB DMA buffers */ | ||
swiotlb_update_mem_attributes(); | ||
|
||
print_mem_encrypt_feature_info(); | ||
} | ||
|
||
int arch_has_restricted_virtio_memory_access(void) | ||
{ | ||
return cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT); | ||
} | ||
EXPORT_SYMBOL_GPL(arch_has_restricted_virtio_memory_access); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters