x86/hyperv: Add sev-snp enlightened guest static key
authorTianyu Lan <tiala@microsoft.com>
Fri, 18 Aug 2023 10:29:11 +0000 (06:29 -0400)
committerWei Liu <wei.liu@kernel.org>
Tue, 22 Aug 2023 00:38:20 +0000 (00:38 +0000)
Introduce static key isolation_type_en_snp for enlightened
sev-snp guest check.

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-2-ltykernel@gmail.com
arch/x86/hyperv/ivm.c
arch/x86/include/asm/mshyperv.h
arch/x86/kernel/cpu/mshyperv.c
drivers/hv/hv_common.c
include/asm-generic/mshyperv.h

index 14f46ad..b2b5cb1 100644 (file)
@@ -413,3 +413,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);
+}
+
index 88d9ef9..9f11f04 100644 (file)
@@ -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,
@@ -239,6 +240,7 @@ static inline void hv_vtom_init(void) {}
 #endif
 
 extern bool hv_isolation_type_snp(void);
+extern bool hv_isolation_type_en_snp(void);
 
 static inline bool hv_is_synic_reg(unsigned int reg)
 {
index c7969e8..5398fb2 100644 (file)
@@ -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,8 @@ 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))
+           ((hv_get_isolation_type() == HV_ISOLATION_TYPE_SNP) &&
+           ms_hyperv.paravisor_present))
                hv_vtom_init();
        /*
         * Setup the hook to get control post apic initialization.
index 542a1d5..4b4aa53 100644 (file)
@@ -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))
 {
 }
index 402a8c1..580c766 100644 (file)
@@ -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 reserved_a1 : 31;
+               };
+       };
        union {
                u32 isolation_config_b;
                struct {
                        u32 cvm_type : 4;
-                       u32 reserved1 : 1;
+                       u32 reserved_b1 : 1;
                        u32 shared_gpa_boundary_active : 1;
                        u32 shared_gpa_boundary_bits : 6;
-                       u32 reserved2 : 20;
+                       u32 reserved_b2 : 20;
                };
        };
        u64 shared_gpa_boundary;
@@ -58,6 +64,7 @@ extern void * __percpu *hyperv_pcpu_output_arg;
 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);
 
 /* Helper functions that provide a consistent pattern for checking Hyper-V hypercall status. */
 static inline int hv_result(u64 status)