lkml.org 
[lkml]   [2021]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 020/207] x86/hyperv: Move required MSRs check to initial platform probing
    Date
    From: Sean Christopherson <seanjc@google.com>

    [ Upstream commit f3e613e72f66226b3bea1046c1b864f67a3000a4 ]

    Explicitly check for MSR_HYPERCALL and MSR_VP_INDEX support when probing
    for running as a Hyper-V guest instead of waiting until hyperv_init() to
    detect the bogus configuration. Add messages to give the admin a heads
    up that they are likely running on a broken virtual machine setup.

    At best, silently disabling Hyper-V is confusing and difficult to debug,
    e.g. the kernel _says_ it's using all these fancy Hyper-V features, but
    always falls back to the native versions. At worst, the half baked setup
    will crash/hang the kernel.

    Reviewed-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: Sean Christopherson <seanjc@google.com>
    Link: https://lore.kernel.org/r/20211104182239.1302956-3-seanjc@google.com
    Signed-off-by: Wei Liu <wei.liu@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/x86/hyperv/hv_init.c | 9 +--------
    arch/x86/kernel/cpu/mshyperv.c | 20 +++++++++++++++-----
    2 files changed, 16 insertions(+), 13 deletions(-)

    diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
    index d20eef3d452a5..b6d48ca5b0f17 100644
    --- a/arch/x86/hyperv/hv_init.c
    +++ b/arch/x86/hyperv/hv_init.c
    @@ -348,20 +348,13 @@ static void __init hv_get_partition_id(void)
    */
    void __init hyperv_init(void)
    {
    - u64 guest_id, required_msrs;
    + u64 guest_id;
    union hv_x64_msr_hypercall_contents hypercall_msr;
    int cpuhp;

    if (x86_hyper_type != X86_HYPER_MS_HYPERV)
    return;

    - /* Absolutely required MSRs */
    - required_msrs = HV_MSR_HYPERCALL_AVAILABLE |
    - HV_MSR_VP_INDEX_AVAILABLE;
    -
    - if ((ms_hyperv.features & required_msrs) != required_msrs)
    - return;
    -
    if (hv_common_init())
    return;

    diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c
    index e095c28d27ae8..ef6316fef99ff 100644
    --- a/arch/x86/kernel/cpu/mshyperv.c
    +++ b/arch/x86/kernel/cpu/mshyperv.c
    @@ -163,12 +163,22 @@ static uint32_t __init ms_hyperv_platform(void)
    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;
    + if (eax < HYPERV_CPUID_MIN || eax > HYPERV_CPUID_MAX ||
    + memcmp("Microsoft Hv", hyp_signature, 12))
    + return 0;

    - return 0;
    + /* HYPERCALL and VP_INDEX MSRs are mandatory for all features. */
    + eax = cpuid_eax(HYPERV_CPUID_FEATURES);
    + if (!(eax & HV_MSR_HYPERCALL_AVAILABLE)) {
    + pr_warn("x86/hyperv: HYPERCALL MSR not available.\n");
    + return 0;
    + }
    + if (!(eax & HV_MSR_VP_INDEX_AVAILABLE)) {
    + pr_warn("x86/hyperv: VP_INDEX MSR not available.\n");
    + return 0;
    + }
    +
    + return HYPERV_CPUID_VENDOR_AND_MAX_FUNCTIONS;
    }

    static unsigned char hv_get_nmi_reason(void)
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-12-06 16:41    [W:5.416 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site