From e6aa2b85a9aecba0e19c5fe82e93f46f107ec7e9 Mon Sep 17 00:00:00 2001 From: Zenithal Date: Wed, 17 May 2023 23:44:43 +0800 Subject: [PATCH] [module] AMD SEV support --- AUTHORS | 1 + module/kvmfr.c | 27 +++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 247753d6..76f72fc7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -66,3 +66,4 @@ David Meier (Kenny.ch) Daniel Cordero (0xdc) esi (esibun) MakiseKurisu (MakiseKurisu) +Zenithal (ZenithalHourlyRate) diff --git a/module/kvmfr.c b/module/kvmfr.c index c711e000..32162aaf 100644 --- a/module/kvmfr.c +++ b/module/kvmfr.c @@ -1,6 +1,6 @@ /** * Looking Glass - * Copyright © 2017-2022 The Looking Glass Authors + * Copyright © 2017-2023 The Looking Glass Authors * https://looking-glass.io * * This program is free software; you can redistribute it and/or modify it @@ -33,6 +33,10 @@ #include +#ifdef CONFIG_AMD_MEM_ENCRYPT +#include +#endif + #include "kvmfr.h" DEFINE_MUTEX(minor_lock); @@ -321,6 +325,25 @@ static int device_mmap(struct file * filp, struct vm_area_struct * vma) switch (kdev->type) { case KVMFR_TYPE_PCI: +#ifdef CONFIG_AMD_MEM_ENCRYPT + /* Clear C-bit for ivshmem when mapped + * as normal memory to the userspace + * + * devm_memremap below will "hotplug" the ivshmem as normal mem, + * when sev and/or sev-snp is effective, + * ivshmem will be encrypted and private memory. + * + * However, this is not the intention of ivshmem, as it + * is meant to be shared with other VMs and the hypervisor. + * + * Mapping ivshmem as iomem could resolve the sev/sev-snp issue, + * but it then will not be cached and the performance is low. + * + * To maintain high performance yet make it shared, we should + * clear the C-bit for ivshmem. + */ + vma->vm_page_prot.pgprot &= ~(sme_me_mask); +#endif vma->vm_ops = &pci_mmap_ops; vma->vm_private_data = kdev; return 0; @@ -626,7 +649,7 @@ MODULE_DEVICE_TABLE(pci, kvmfr_pci_ids); MODULE_LICENSE("GPL v2"); MODULE_AUTHOR("Geoffrey McRae "); MODULE_AUTHOR("Guanzhong Chen "); -MODULE_VERSION("0.0.8"); +MODULE_VERSION("0.0.9"); #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,16,0) MODULE_IMPORT_NS(DMA_BUF); #endif