]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
x86/hyperv: Add hv_isolation_type_tdx() to detect TDX guests
authorDexuan Cui <decui@microsoft.com>
Thu, 24 Aug 2023 08:07:03 +0000 (01:07 -0700)
committerWei Liu <wei.liu@kernel.org>
Fri, 25 Aug 2023 00:04:56 +0000 (00:04 +0000)
No logic change to SNP/VBS guests.

hv_isolation_type_tdx() will be used to instruct a TDX guest on Hyper-V to
do some TDX-specific operations, e.g. for a fully enlightened TDX guest
(i.e. without the paravisor), hv_do_hypercall() should use
__tdx_hypercall() and such a guest on Hyper-V should handle the Hyper-V
Event/Message/Monitor pages specially.

Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Tianyu Lan <tiala@microsoft.com>
Signed-off-by: Dexuan Cui <decui@microsoft.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Link: https://lore.kernel.org/r/20230824080712.30327-2-decui@microsoft.com
arch/x86/hyperv/ivm.c
arch/x86/include/asm/hyperv-tlfs.h
arch/x86/include/asm/mshyperv.h
arch/x86/kernel/cpu/mshyperv.c
drivers/hv/hv_common.c
include/asm-generic/mshyperv.h

index cbbd3af4c3daf3b99f1e727711c29ff1181034ed..afdae1a8a117734c603ade9f363f0172638ed8f4 100644 (file)
@@ -562,3 +562,12 @@ bool hv_isolation_type_en_snp(void)
        return static_branch_unlikely(&isolation_type_en_snp);
 }
 
+DEFINE_STATIC_KEY_FALSE(isolation_type_tdx);
+/*
+ * hv_isolation_type_tdx - Check if the system runs in an Intel TDX based
+ * isolated VM.
+ */
+bool hv_isolation_type_tdx(void)
+{
+       return static_branch_unlikely(&isolation_type_tdx);
+}
index 4bf0b315b0ce9a5ba3471468064efe58cba7beea..2ff26f53cd62446e6260025b7a7094fee1d5b765 100644 (file)
 enum hv_isolation_type {
        HV_ISOLATION_TYPE_NONE  = 0,
        HV_ISOLATION_TYPE_VBS   = 1,
-       HV_ISOLATION_TYPE_SNP   = 2
+       HV_ISOLATION_TYPE_SNP   = 2,
+       HV_ISOLATION_TYPE_TDX   = 3
 };
 
 /* Hyper-V specific model specific registers (MSRs) */
index b6be267ff3d06e33b1ed771b6e8bd6d42e379627..3feb4e36851e48e571458e003889f5b8e7d5e370 100644 (file)
@@ -27,6 +27,7 @@ union hv_ghcb;
 
 DECLARE_STATIC_KEY_FALSE(isolation_type_snp);
 DECLARE_STATIC_KEY_FALSE(isolation_type_en_snp);
+DECLARE_STATIC_KEY_FALSE(isolation_type_tdx);
 
 typedef int (*hyperv_fill_flush_list_func)(
                struct hv_guest_mapping_flush_list *flush,
@@ -49,6 +50,8 @@ extern u64 hv_current_partition_id;
 extern union hv_ghcb * __percpu *hv_ghcb_pg;
 
 extern bool hv_isolation_type_en_snp(void);
+bool hv_isolation_type_tdx(void);
+
 /*
  * DEFAULT INIT GPAT and SEGMENT LIMIT value in struct VMSA
  * to start AP in enlightened SEV guest.
index c8d3ca2b0e0eefbb30e666422b11fb8324ea814c..63093870ec3374cc0386cdee8a5bdb55e25ef15d 100644 (file)
@@ -418,6 +418,8 @@ static void __init ms_hyperv_init_platform(void)
                                static_branch_enable(&isolation_type_snp);
                        else
                                static_branch_enable(&isolation_type_en_snp);
+               } else if (hv_get_isolation_type() == HV_ISOLATION_TYPE_TDX) {
+                       static_branch_enable(&isolation_type_tdx);
                }
        }
 
index 2d43ba2bc925d39a4f3fc7f32d7f071f6d3ed877..da3307533f4d71f48eab99253cd00d2fddf73121 100644 (file)
@@ -521,6 +521,12 @@ bool __weak hv_isolation_type_en_snp(void)
 }
 EXPORT_SYMBOL_GPL(hv_isolation_type_en_snp);
 
+bool __weak hv_isolation_type_tdx(void)
+{
+       return false;
+}
+EXPORT_SYMBOL_GPL(hv_isolation_type_tdx);
+
 void __weak hv_setup_vmbus_handler(void (*handler)(void))
 {
 }
index efd0d2aedad39327fed2a3fe7dcd7f0e47259e9d..82eba2d5fc4cd1af9474a5f8a52a8f1a0a18e843 100644 (file)
@@ -66,6 +66,7 @@ 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);
+bool hv_isolation_type_tdx(void);
 
 /* Helper functions that provide a consistent pattern for checking Hyper-V hypercall status. */
 static inline int hv_result(u64 status)