Merge tag 'hyperv-next-signed-20240320' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / arch / x86 / kernel / cpu / mshyperv.c
index 303fef824167d9c57e8b6068eecd62f31f071638..e0fd57a8ba840431e1f48dd61c1bc0ffc9fc0d82 100644 (file)
@@ -45,70 +45,70 @@ bool hyperv_paravisor_present __ro_after_init;
 EXPORT_SYMBOL_GPL(hyperv_paravisor_present);
 
 #if IS_ENABLED(CONFIG_HYPERV)
-static inline unsigned int hv_get_nested_reg(unsigned int reg)
+static inline unsigned int hv_get_nested_msr(unsigned int reg)
 {
-       if (hv_is_sint_reg(reg))
-               return reg - HV_REGISTER_SINT0 + HV_REGISTER_NESTED_SINT0;
+       if (hv_is_sint_msr(reg))
+               return reg - HV_X64_MSR_SINT0 + HV_X64_MSR_NESTED_SINT0;
 
        switch (reg) {
-       case HV_REGISTER_SIMP:
-               return HV_REGISTER_NESTED_SIMP;
-       case HV_REGISTER_SIEFP:
-               return HV_REGISTER_NESTED_SIEFP;
-       case HV_REGISTER_SVERSION:
-               return HV_REGISTER_NESTED_SVERSION;
-       case HV_REGISTER_SCONTROL:
-               return HV_REGISTER_NESTED_SCONTROL;
-       case HV_REGISTER_EOM:
-               return HV_REGISTER_NESTED_EOM;
+       case HV_X64_MSR_SIMP:
+               return HV_X64_MSR_NESTED_SIMP;
+       case HV_X64_MSR_SIEFP:
+               return HV_X64_MSR_NESTED_SIEFP;
+       case HV_X64_MSR_SVERSION:
+               return HV_X64_MSR_NESTED_SVERSION;
+       case HV_X64_MSR_SCONTROL:
+               return HV_X64_MSR_NESTED_SCONTROL;
+       case HV_X64_MSR_EOM:
+               return HV_X64_MSR_NESTED_EOM;
        default:
                return reg;
        }
 }
 
-u64 hv_get_non_nested_register(unsigned int reg)
+u64 hv_get_non_nested_msr(unsigned int reg)
 {
        u64 value;
 
-       if (hv_is_synic_reg(reg) && ms_hyperv.paravisor_present)
+       if (hv_is_synic_msr(reg) && ms_hyperv.paravisor_present)
                hv_ivm_msr_read(reg, &value);
        else
                rdmsrl(reg, value);
        return value;
 }
-EXPORT_SYMBOL_GPL(hv_get_non_nested_register);
+EXPORT_SYMBOL_GPL(hv_get_non_nested_msr);
 
-void hv_set_non_nested_register(unsigned int reg, u64 value)
+void hv_set_non_nested_msr(unsigned int reg, u64 value)
 {
-       if (hv_is_synic_reg(reg) && ms_hyperv.paravisor_present) {
+       if (hv_is_synic_msr(reg) && ms_hyperv.paravisor_present) {
                hv_ivm_msr_write(reg, value);
 
                /* Write proxy bit via wrmsl instruction */
-               if (hv_is_sint_reg(reg))
+               if (hv_is_sint_msr(reg))
                        wrmsrl(reg, value | 1 << 20);
        } else {
                wrmsrl(reg, value);
        }
 }
-EXPORT_SYMBOL_GPL(hv_set_non_nested_register);
+EXPORT_SYMBOL_GPL(hv_set_non_nested_msr);
 
-u64 hv_get_register(unsigned int reg)
+u64 hv_get_msr(unsigned int reg)
 {
        if (hv_nested)
-               reg = hv_get_nested_reg(reg);
+               reg = hv_get_nested_msr(reg);
 
-       return hv_get_non_nested_register(reg);
+       return hv_get_non_nested_msr(reg);
 }
-EXPORT_SYMBOL_GPL(hv_get_register);
+EXPORT_SYMBOL_GPL(hv_get_msr);
 
-void hv_set_register(unsigned int reg, u64 value)
+void hv_set_msr(unsigned int reg, u64 value)
 {
        if (hv_nested)
-               reg = hv_get_nested_reg(reg);
+               reg = hv_get_nested_msr(reg);
 
-       hv_set_non_nested_register(reg, value);
+       hv_set_non_nested_msr(reg, value);
 }
-EXPORT_SYMBOL_GPL(hv_set_register);
+EXPORT_SYMBOL_GPL(hv_set_msr);
 
 static void (*vmbus_handler)(void);
 static void (*hv_stimer0_handler)(void);
@@ -352,13 +352,24 @@ static void __init reduced_hw_init(void)
        x86_init.irqs.pre_vector_init   = x86_init_noop;
 }
 
+int hv_get_hypervisor_version(union hv_hypervisor_version_info *info)
+{
+       unsigned int hv_max_functions;
+
+       hv_max_functions = cpuid_eax(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS);
+       if (hv_max_functions < HYPERV_CPUID_VERSION) {
+               pr_err("%s: Could not detect Hyper-V version\n", __func__);
+               return -ENODEV;
+       }
+
+       cpuid(HYPERV_CPUID_VERSION, &info->eax, &info->ebx, &info->ecx, &info->edx);
+
+       return 0;
+}
+
 static void __init ms_hyperv_init_platform(void)
 {
        int hv_max_functions_eax;
-       int hv_host_info_eax;
-       int hv_host_info_ebx;
-       int hv_host_info_ecx;
-       int hv_host_info_edx;
 
 #ifdef CONFIG_PARAVIRT
        pv_info.name = "Hyper-V";
@@ -409,21 +420,6 @@ static void __init ms_hyperv_init_platform(void)
                pr_info("Hyper-V: running on a nested hypervisor\n");
        }
 
-       /*
-        * Extract host information.
-        */
-       if (hv_max_functions_eax >= HYPERV_CPUID_VERSION) {
-               hv_host_info_eax = cpuid_eax(HYPERV_CPUID_VERSION);
-               hv_host_info_ebx = cpuid_ebx(HYPERV_CPUID_VERSION);
-               hv_host_info_ecx = cpuid_ecx(HYPERV_CPUID_VERSION);
-               hv_host_info_edx = cpuid_edx(HYPERV_CPUID_VERSION);
-
-               pr_info("Hyper-V: Host Build %d.%d.%d.%d-%d-%d\n",
-                       hv_host_info_ebx >> 16, hv_host_info_ebx & 0xFFFF,
-                       hv_host_info_eax, hv_host_info_edx & 0xFFFFFF,
-                       hv_host_info_ecx, hv_host_info_edx >> 24);
-       }
-
        if (ms_hyperv.features & HV_ACCESS_FREQUENCY_MSRS &&
            ms_hyperv.misc_features & HV_FEATURE_FREQUENCY_MSRS_AVAILABLE) {
                x86_platform.calibrate_tsc = hv_get_tsc_khz;
@@ -456,7 +452,7 @@ static void __init ms_hyperv_init_platform(void)
                                /* To be supported: more work is required.  */
                                ms_hyperv.features &= ~HV_MSR_REFERENCE_TSC_AVAILABLE;
 
-                               /* HV_REGISTER_CRASH_CTL is unsupported. */
+                               /* HV_MSR_CRASH_CTL is unsupported. */
                                ms_hyperv.misc_features &= ~HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE;
 
                                /* Don't trust Hyper-V's TLB-flushing hypercalls. */
@@ -648,6 +644,7 @@ const __initconst struct hypervisor_x86 x86_hyper_ms_hyperv = {
        .init.x2apic_available  = ms_hyperv_x2apic_available,
        .init.msi_ext_dest_id   = ms_hyperv_msi_ext_dest_id,
        .init.init_platform     = ms_hyperv_init_platform,
+       .init.guest_late_init   = ms_hyperv_late_init,
 #ifdef CONFIG_AMD_MEM_ENCRYPT
        .runtime.sev_es_hcall_prepare = hv_sev_es_hcall_prepare,
        .runtime.sev_es_hcall_finish = hv_sev_es_hcall_finish,