From: Tianyu Lan <ltykernel@xxxxxxxxx> Sent: Thursday, June 1, 2023 8:16 AM > > Introduce static key isolation_type_en_snp for enlightened > sev-snp guest check. > > Signed-off-by: Tianyu Lan <tiala@xxxxxxxxxxxxx> > --- > arch/x86/hyperv/ivm.c | 11 +++++++++++ > arch/x86/include/asm/mshyperv.h | 3 +++ > arch/x86/kernel/cpu/mshyperv.c | 8 ++++++-- > drivers/hv/hv_common.c | 6 ++++++ > include/asm-generic/mshyperv.h | 12 +++++++++--- > 5 files changed, 35 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/hyperv/ivm.c b/arch/x86/hyperv/ivm.c > index cc92388b7a99..5d3ee3124e00 100644 > --- a/arch/x86/hyperv/ivm.c > +++ b/arch/x86/hyperv/ivm.c > @@ -409,3 +409,14 @@ bool hv_isolation_type_snp(void) > { > return static_branch_unlikely(&isolation_type_snp); > } > + > +DEFINE_STATIC_KEY_FALSE(isolation_type_en_snp); > +/* > + * hv_isolation_type_en_snp - Check system runs in the AMD SEV-SNP based > + * isolation enlightened VM. > + */ > +bool hv_isolation_type_en_snp(void) > +{ > + return static_branch_unlikely(&isolation_type_en_snp); > +} > + > diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h > index 49bb4f2bd300..31c476f4e656 100644 > --- a/arch/x86/include/asm/mshyperv.h > +++ b/arch/x86/include/asm/mshyperv.h > @@ -26,6 +26,7 @@ > union hv_ghcb; > > DECLARE_STATIC_KEY_FALSE(isolation_type_snp); > +DECLARE_STATIC_KEY_FALSE(isolation_type_en_snp); > > typedef int (*hyperv_fill_flush_list_func)( > struct hv_guest_mapping_flush_list *flush, > @@ -45,6 +46,8 @@ extern void *hv_hypercall_pg; > > extern u64 hv_current_partition_id; > > +extern bool hv_isolation_type_en_snp(void); > + > extern union hv_ghcb * __percpu *hv_ghcb_pg; > > int hv_call_deposit_pages(int node, u64 partition_id, u32 num_pages); > diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c > index c7969e806c64..9186453251f7 100644 > --- a/arch/x86/kernel/cpu/mshyperv.c > +++ b/arch/x86/kernel/cpu/mshyperv.c > @@ -402,8 +402,12 @@ static void __init ms_hyperv_init_platform(void) > pr_info("Hyper-V: Isolation Config: Group A 0x%x, Group B 0x%x\n", > ms_hyperv.isolation_config_a, ms_hyperv.isolation_config_b); > > - if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) > + > + if (cc_platform_has(CC_ATTR_GUEST_SEV_SNP)) { > + static_branch_enable(&isolation_type_en_snp); > + } else if (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) { > static_branch_enable(&isolation_type_snp); > + } > } > > if (hv_max_functions_eax >= HYPERV_CPUID_NESTED_FEATURES) { > @@ -473,7 +477,7 @@ static void __init ms_hyperv_init_platform(void) > > #if IS_ENABLED(CONFIG_HYPERV) > if ((hv_get_isolation_type() == HV_ISOLATION_TYPE_VBS) || > - (hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP)) > + ms_hyperv.paravisor_present) This test needs to be: if ((hv_get_isolation_type() == HV_ISOLATION_TYPE_VBS) || ((hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) && ms_hyperv.paravisor_present) We want to call hv_vtom_init() only when running with VBS, or with SEV-SNP *and* we have a paravisor present. Testing only for paravisor_present risks confusion with future TDX scenarios. > hv_vtom_init(); > /* > * Setup the hook to get control post apic initialization. > diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c > index 64f9ceca887b..179bc5f5bf52 100644 > --- a/drivers/hv/hv_common.c > +++ b/drivers/hv/hv_common.c > @@ -502,6 +502,12 @@ bool __weak hv_isolation_type_snp(void) > } > EXPORT_SYMBOL_GPL(hv_isolation_type_snp); > > +bool __weak hv_isolation_type_en_snp(void) > +{ > + return false; > +} > +EXPORT_SYMBOL_GPL(hv_isolation_type_en_snp); > + > void __weak hv_setup_vmbus_handler(void (*handler)(void)) > { > } > diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h > index 402a8c1c202d..d444f831d633 100644 > --- a/include/asm-generic/mshyperv.h > +++ b/include/asm-generic/mshyperv.h > @@ -36,15 +36,21 @@ struct ms_hyperv_info { > u32 nested_features; > u32 max_vp_index; > u32 max_lp_index; > - u32 isolation_config_a; > + union { > + u32 isolation_config_a; > + struct { > + u32 paravisor_present : 1; > + u32 reserved1 : 31; > + }; > + }; > union { > u32 isolation_config_b; > struct { > u32 cvm_type : 4; > - u32 reserved1 : 1; > + u32 reserved2 : 1; > u32 shared_gpa_boundary_active : 1; > u32 shared_gpa_boundary_bits : 6; > - u32 reserved2 : 20; > + u32 reserved3 : 20; > }; > }; > u64 shared_gpa_boundary; > -- > 2.25.1