x86/hyperv: Mark Hyper-V vp assist page unencrypted in SEV-SNP enlightened guest
authorTianyu Lan <tiala@microsoft.com>
Fri, 18 Aug 2023 10:29:13 +0000 (06:29 -0400)
committerWei Liu <wei.liu@kernel.org>
Tue, 22 Aug 2023 00:38:20 +0000 (00:38 +0000)
hv vp assist page needs to be shared between SEV-SNP guest and Hyper-V.
So mark the page unencrypted in the SEV-SNP guest.

Reviewed-by: Dexuan Cui <decui@microsoft.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Tianyu Lan <tiala@microsoft.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Link: https://lore.kernel.org/r/20230818102919.1318039-4-ltykernel@gmail.com
arch/x86/hyperv/hv_init.c

index 318010e..bcfbcda 100644 (file)
@@ -18,6 +18,7 @@
 #include <asm/hyperv-tlfs.h>
 #include <asm/mshyperv.h>
 #include <asm/idtentry.h>
+#include <asm/set_memory.h>
 #include <linux/kexec.h>
 #include <linux/version.h>
 #include <linux/vmalloc.h>
@@ -106,8 +107,21 @@ static int hv_cpu_init(unsigned int cpu)
                 * in hv_cpu_die(), otherwise a CPU may not be stopped in the
                 * case of CPU offlining and the VM will hang.
                 */
-               if (!*hvp)
+               if (!*hvp) {
                        *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL | __GFP_ZERO);
+
+                       /*
+                        * Hyper-V should never specify a VM that is a Confidential
+                        * VM and also running in the root partition. Root partition
+                        * is blocked to run in Confidential VM. So only decrypt assist
+                        * page in non-root partition here.
+                        */
+                       if (*hvp && hv_isolation_type_en_snp()) {
+                               WARN_ON_ONCE(set_memory_decrypted((unsigned long)(*hvp), 1));
+                               memset(*hvp, 0, PAGE_SIZE);
+                       }
+               }
+
                if (*hvp)
                        msr.pfn = vmalloc_to_pfn(*hvp);