From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752540AbbJBL0h (ORCPT ); Fri, 2 Oct 2015 07:26:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41680 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752481AbbJBL0g (ORCPT ); Fri, 2 Oct 2015 07:26:36 -0400 From: Vitaly Kuznetsov To: Paolo Bonzini Cc: linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, haiyangz@microsoft.com, alex.williamson@redhat.com, x86@kernel.org, "K. Y. Srinivasan" Subject: Re: [PATCH] x86: guest: rely on leaf 0x40000001 to detect Hyper-V References: <1443778007-27714-1-git-send-email-pbonzini@redhat.com> Date: Fri, 02 Oct 2015 13:26:32 +0200 In-Reply-To: <1443778007-27714-1-git-send-email-pbonzini@redhat.com> (Paolo Bonzini's message of "Fri, 2 Oct 2015 11:26:47 +0200") Message-ID: <874mi9o6jb.fsf@vitty.brq.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Paolo Bonzini writes: > The specification says that "Microsoft Hv" is actually a vendor ID field > that is only used for reporting and diagnostic purposes. The actual > field that you need to check is the interface ID that you get in eax > when querying the HYPERV_CPUID_INTERFACE. > > Change ms_hyperv_platform to actually do what the specification suggests. > This roughy matches what Windows looks for, though Windows actually > ignores HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS completely. > > Signed-off-by: Paolo Bonzini Reviewed-by: Vitaly Kuznetsov (and it seems K. Y. is missing on the CC: list, fixed). > --- > arch/x86/kernel/cpu/mshyperv.c | 14 ++++++-------- > 1 file changed, 6 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c > index 381c8b9b3a33..7910e7fd705b 100644 > --- a/arch/x86/kernel/cpu/mshyperv.c > +++ b/arch/x86/kernel/cpu/mshyperv.c > @@ -116,18 +116,16 @@ static void hv_machine_crash_shutdown(struct pt_regs *regs) > static uint32_t __init ms_hyperv_platform(void) > { > u32 eax; > - u32 hyp_signature[3]; > > if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) > return 0; > > - cpuid(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS, > - &eax, &hyp_signature[0], &hyp_signature[1], &hyp_signature[2]); > - > - if (eax >= HYPERV_CPUID_MIN && > - eax <= HYPERV_CPUID_MAX && > - !memcmp("Microsoft Hv", hyp_signature, 12)) > - return HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS; > + eax = cpuid_eax(HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS); > + if (eax >= HYPERV_CPUID_MIN && eax <= HYPERV_CPUID_MAX) { > + eax = cpuid_eax(HYPERV_CPUID_INTERFACE); > + if (!memcmp(&eax, "Hv#1", sizeof(eax))) > + return HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS; > + } > > return 0; > } -- Vitaly