x86/hyperv: Add hv_isolation_type_tdx() to detect TDX guests

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
This commit is contained in:
Dexuan Cui 2023-08-24 01:07:03 -07:00 committed by Wei Liu
parent 86e619c922
commit 08e9d12077
6 changed files with 23 additions and 1 deletions

View File

@ -562,3 +562,12 @@ bool hv_isolation_type_en_snp(void)
return static_branch_unlikely(&isolation_type_en_snp); 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);
}

View File

@ -169,7 +169,8 @@
enum hv_isolation_type { enum hv_isolation_type {
HV_ISOLATION_TYPE_NONE = 0, HV_ISOLATION_TYPE_NONE = 0,
HV_ISOLATION_TYPE_VBS = 1, 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) */ /* Hyper-V specific model specific registers (MSRs) */

View File

@ -27,6 +27,7 @@ union hv_ghcb;
DECLARE_STATIC_KEY_FALSE(isolation_type_snp); DECLARE_STATIC_KEY_FALSE(isolation_type_snp);
DECLARE_STATIC_KEY_FALSE(isolation_type_en_snp); DECLARE_STATIC_KEY_FALSE(isolation_type_en_snp);
DECLARE_STATIC_KEY_FALSE(isolation_type_tdx);
typedef int (*hyperv_fill_flush_list_func)( typedef int (*hyperv_fill_flush_list_func)(
struct hv_guest_mapping_flush_list *flush, 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 union hv_ghcb * __percpu *hv_ghcb_pg;
extern bool hv_isolation_type_en_snp(void); extern bool hv_isolation_type_en_snp(void);
bool hv_isolation_type_tdx(void);
/* /*
* DEFAULT INIT GPAT and SEGMENT LIMIT value in struct VMSA * DEFAULT INIT GPAT and SEGMENT LIMIT value in struct VMSA
* to start AP in enlightened SEV guest. * to start AP in enlightened SEV guest.

View File

@ -418,6 +418,8 @@ static void __init ms_hyperv_init_platform(void)
static_branch_enable(&isolation_type_snp); static_branch_enable(&isolation_type_snp);
else else
static_branch_enable(&isolation_type_en_snp); static_branch_enable(&isolation_type_en_snp);
} else if (hv_get_isolation_type() == HV_ISOLATION_TYPE_TDX) {
static_branch_enable(&isolation_type_tdx);
} }
} }

View File

@ -521,6 +521,12 @@ bool __weak hv_isolation_type_en_snp(void)
} }
EXPORT_SYMBOL_GPL(hv_isolation_type_en_snp); 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)) void __weak hv_setup_vmbus_handler(void (*handler)(void))
{ {
} }

View 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 u64 hv_do_fast_hypercall8(u16 control, u64 input8);
extern bool hv_isolation_type_snp(void); extern bool hv_isolation_type_snp(void);
extern bool hv_isolation_type_en_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. */ /* Helper functions that provide a consistent pattern for checking Hyper-V hypercall status. */
static inline int hv_result(u64 status) static inline int hv_result(u64 status)