mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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:
parent
86e619c922
commit
08e9d12077
@ -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);
|
||||||
|
}
|
||||||
|
@ -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) */
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user