OSDN Git Service

x86/hyper-v: move definitions from TLFS to hyperv-tlfs.h
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 20 Mar 2018 14:02:06 +0000 (15:02 +0100)
committerRadim Krčmář <rkrcmar@redhat.com>
Wed, 28 Mar 2018 20:47:06 +0000 (22:47 +0200)
mshyperv.h now only contains fucntions/variables we define in kernel, all
definitions from TLFS should go to hyperv-tlfs.h.

'enum hv_cpuid_function' is removed as we already have this info in
hyperv-tlfs.h, code in mshyperv.c is adjusted accordingly.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Acked-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 77d6e8b..a9d6738 100644 (file)
 #define HV_X64_MSR_CRASH_PARAMS                \
                (1 + (HV_X64_MSR_CRASH_P4 - HV_X64_MSR_CRASH_P0))
 
+/*
+ * Declare the MSR used to setup pages used to communicate with the hypervisor.
+ */
+union hv_x64_msr_hypercall_contents {
+       u64 as_uint64;
+       struct {
+               u64 enable:1;
+               u64 reserved:11;
+               u64 guest_physical_address:52;
+       };
+};
+
+/*
+ * TSC page layout.
+ */
+struct ms_hyperv_tsc_page {
+       volatile u32 tsc_sequence;
+       u32 reserved1;
+       volatile u64 tsc_scale;
+       volatile s64 tsc_offset;
+       u64 reserved2[509];
+};
+
+/*
+ * The guest OS needs to register the guest ID with the hypervisor.
+ * The guest ID is a 64 bit entity and the structure of this ID is
+ * specified in the Hyper-V specification:
+ *
+ * msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
+ *
+ * While the current guideline does not specify how Linux guest ID(s)
+ * need to be generated, our plan is to publish the guidelines for
+ * Linux and other guest operating systems that currently are hosted
+ * on Hyper-V. The implementation here conforms to this yet
+ * unpublished guidelines.
+ *
+ *
+ * Bit(s)
+ * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
+ * 62:56 - Os Type; Linux is 0x100
+ * 55:48 - Distro specific identification
+ * 47:16 - Linux kernel version number
+ * 15:0  - Distro specific identification
+ *
+ *
+ */
+
+#define HV_LINUX_VENDOR_ID              0x8100
+
 /* TSC emulation after migration */
 #define HV_X64_MSR_REENLIGHTENMENT_CONTROL     0x40000106
 
@@ -305,6 +354,14 @@ enum HV_GENERIC_SET_FORMAT {
        HV_GENERIC_SET_ALL,
 };
 
+#define HV_HYPERCALL_RESULT_MASK       GENMASK_ULL(15, 0)
+#define HV_HYPERCALL_FAST_BIT          BIT(16)
+#define HV_HYPERCALL_VARHEAD_OFFSET    17
+#define HV_HYPERCALL_REP_COMP_OFFSET   32
+#define HV_HYPERCALL_REP_COMP_MASK     GENMASK_ULL(43, 32)
+#define HV_HYPERCALL_REP_START_OFFSET  48
+#define HV_HYPERCALL_REP_START_MASK    GENMASK_ULL(59, 48)
+
 /* hypercall status code */
 #define HV_STATUS_SUCCESS                      0
 #define HV_STATUS_INVALID_HYPERCALL_CODE       2
index 044323a..38cfbe9 100644 (file)
@@ -9,25 +9,6 @@
 #include <asm/hyperv-tlfs.h>
 #include <asm/nospec-branch.h>
 
-/*
- * The below CPUID leaves are present if VersionAndFeatures.HypervisorPresent
- * is set by CPUID(HVCPUID_VERSION_FEATURES).
- */
-enum hv_cpuid_function {
-       HVCPUID_VERSION_FEATURES                = 0x00000001,
-       HVCPUID_VENDOR_MAXFUNCTION              = 0x40000000,
-       HVCPUID_INTERFACE                       = 0x40000001,
-
-       /*
-        * The remaining functions depend on the value of
-        * HVCPUID_INTERFACE
-        */
-       HVCPUID_VERSION                         = 0x40000002,
-       HVCPUID_FEATURES                        = 0x40000003,
-       HVCPUID_ENLIGHTENMENT_INFO              = 0x40000004,
-       HVCPUID_IMPLEMENTATION_LIMITS           = 0x40000005,
-};
-
 struct ms_hyperv_info {
        u32 features;
        u32 misc_features;
@@ -38,58 +19,9 @@ struct ms_hyperv_info {
 
 extern struct ms_hyperv_info ms_hyperv;
 
-/*
- * Declare the MSR used to setup pages used to communicate with the hypervisor.
- */
-union hv_x64_msr_hypercall_contents {
-       u64 as_uint64;
-       struct {
-               u64 enable:1;
-               u64 reserved:11;
-               u64 guest_physical_address:52;
-       };
-};
-
-/*
- * TSC page layout.
- */
-
-struct ms_hyperv_tsc_page {
-       volatile u32 tsc_sequence;
-       u32 reserved1;
-       volatile u64 tsc_scale;
-       volatile s64 tsc_offset;
-       u64 reserved2[509];
-};
 
 /*
- * The guest OS needs to register the guest ID with the hypervisor.
- * The guest ID is a 64 bit entity and the structure of this ID is
- * specified in the Hyper-V specification:
- *
- * msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx
- *
- * While the current guideline does not specify how Linux guest ID(s)
- * need to be generated, our plan is to publish the guidelines for
- * Linux and other guest operating systems that currently are hosted
- * on Hyper-V. The implementation here conforms to this yet
- * unpublished guidelines.
- *
- *
- * Bit(s)
- * 63 - Indicates if the OS is Open Source or not; 1 is Open Source
- * 62:56 - Os Type; Linux is 0x100
- * 55:48 - Distro specific identification
- * 47:16 - Linux kernel version number
- * 15:0  - Distro specific identification
- *
- *
- */
-
-#define HV_LINUX_VENDOR_ID              0x8100
-
-/*
- * Generate the guest ID based on the guideline described above.
+ * Generate the guest ID.
  */
 
 static inline  __u64 generate_guest_id(__u64 d_info1, __u64 kernel_version,
@@ -215,14 +147,6 @@ static inline u64 hv_do_hypercall(u64 control, void *input, void *output)
        return hv_status;
 }
 
-#define HV_HYPERCALL_RESULT_MASK       GENMASK_ULL(15, 0)
-#define HV_HYPERCALL_FAST_BIT          BIT(16)
-#define HV_HYPERCALL_VARHEAD_OFFSET    17
-#define HV_HYPERCALL_REP_COMP_OFFSET   32
-#define HV_HYPERCALL_REP_COMP_MASK     GENMASK_ULL(43, 32)
-#define HV_HYPERCALL_REP_START_OFFSET  48
-#define HV_HYPERCALL_REP_START_MASK    GENMASK_ULL(59, 48)
-
 /* Fast hypercall with 8 bytes of input and no output */
 static inline u64 hv_do_fast_hypercall8(u16 code, u64 input1)
 {
index 04f7604..0dfc568 100644 (file)
@@ -180,8 +180,8 @@ static void __init ms_hyperv_init_platform(void)
        pr_info("Hyper-V: features 0x%x, hints 0x%x\n",
                ms_hyperv.features, ms_hyperv.hints);
 
-       ms_hyperv.max_vp_index = cpuid_eax(HVCPUID_IMPLEMENTATION_LIMITS);
-       ms_hyperv.max_lp_index = cpuid_ebx(HVCPUID_IMPLEMENTATION_LIMITS);
+       ms_hyperv.max_vp_index = cpuid_eax(HYPERV_CPUID_IMPLEMENT_LIMITS);
+       ms_hyperv.max_lp_index = cpuid_ebx(HYPERV_CPUID_IMPLEMENT_LIMITS);
 
        pr_debug("Hyper-V: max %u virtual processors, %u logical processors\n",
                 ms_hyperv.max_vp_index, ms_hyperv.max_lp_index);
@@ -189,11 +189,12 @@ static void __init ms_hyperv_init_platform(void)
        /*
         * Extract host information.
         */
-       if (cpuid_eax(HVCPUID_VENDOR_MAXFUNCTION) >= HVCPUID_VERSION) {
-               hv_host_info_eax = cpuid_eax(HVCPUID_VERSION);
-               hv_host_info_ebx = cpuid_ebx(HVCPUID_VERSION);
-               hv_host_info_ecx = cpuid_ecx(HVCPUID_VERSION);
-               hv_host_info_edx = cpuid_edx(HVCPUID_VERSION);
+       if (cpuid_eax(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS) >=
+           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_eax, hv_host_info_ebx >> 16,