]> git.baikalelectronics.ru Git - kernel.git/commitdiff
x86/hyper-v: detect nested features
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 20 Mar 2018 14:02:10 +0000 (15:02 +0100)
committerRadim Krčmář <rkrcmar@redhat.com>
Wed, 28 Mar 2018 20:47:06 +0000 (22:47 +0200)
TLFS 5.0 says: "Support for an enlightened VMCS interface is reported with
CPUID leaf 0x40000004. If an enlightened VMCS interface is supported,
 additional nested enlightenments may be discovered by reading the CPUID
leaf 0x4000000A (see 2.4.11)."

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
arch/x86/include/asm/hyperv-tlfs.h
arch/x86/include/asm/mshyperv.h
arch/x86/kernel/cpu/mshyperv.c

index bab6a1ad806e0e8b7385582932863cc87aa0568f..1c602ad4bda89097cdfa1f7368cb777caa838111 100644 (file)
@@ -21,6 +21,7 @@
 #define HYPERV_CPUID_FEATURES                  0x40000003
 #define HYPERV_CPUID_ENLIGHTMENT_INFO          0x40000004
 #define HYPERV_CPUID_IMPLEMENT_LIMITS          0x40000005
+#define HYPERV_CPUID_NESTED_FEATURES           0x4000000A
 
 #define HYPERV_HYPERVISOR_PRESENT_BIT          0x80000000
 #define HYPERV_CPUID_MIN                       0x40000005
@@ -339,6 +340,9 @@ struct hv_tsc_emulation_status {
 #define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK \
                (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
 
+/* Hyper-V Enlightened VMCS version mask in nested features CPUID */
+#define HV_X64_ENLIGHTENED_VMCS_VERSION                0xff
+
 #define HV_X64_MSR_TSC_REFERENCE_ENABLE                0x00000001
 #define HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT 12
 
index 3f162353f1807806915aa797f9131aa1c321f71c..57c65315b60b7549e882814a0082312f3d26586b 100644 (file)
@@ -13,6 +13,7 @@ struct ms_hyperv_info {
        u32 features;
        u32 misc_features;
        u32 hints;
+       u32 nested_features;
        u32 max_vp_index;
        u32 max_lp_index;
 };
index 0dfc568c110cac422acee14016a6e3c948e32fa5..1afc0a453bba0def12eba054ade8597f2095abd2 100644 (file)
@@ -208,6 +208,11 @@ static void __init ms_hyperv_init_platform(void)
                x86_platform.calibrate_cpu = hv_get_tsc_khz;
        }
 
+       if (ms_hyperv.hints & HV_X64_ENLIGHTENED_VMCS_RECOMMENDED) {
+               ms_hyperv.nested_features =
+                       cpuid_eax(HYPERV_CPUID_NESTED_FEATURES);
+       }
+
 #ifdef CONFIG_X86_LOCAL_APIC
        if (ms_hyperv.features & HV_X64_ACCESS_FREQUENCY_MSRS &&
            ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) {