diff options
| -rw-r--r-- | arch/x86/include/asm/hyperv-tlfs.h | 57 | ||||
| -rw-r--r-- | arch/x86/include/asm/mshyperv.h | 78 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mshyperv.c | 15 | 
3 files changed, 66 insertions, 84 deletions
diff --git a/arch/x86/include/asm/hyperv-tlfs.h b/arch/x86/include/asm/hyperv-tlfs.h index 77d6e8b10ea9..a9d6738d2071 100644 --- a/arch/x86/include/asm/hyperv-tlfs.h +++ b/arch/x86/include/asm/hyperv-tlfs.h @@ -244,6 +244,55 @@  #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 diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h index 044323a59354..38cfbe9a5794 100644 --- a/arch/x86/include/asm/mshyperv.h +++ b/arch/x86/include/asm/mshyperv.h @@ -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)  { diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index 04f760432a17..0dfc568c110c 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c @@ -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,  | 
