]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
x86/hyperv: Check for required priviliges in hyperv_init()
authorVitaly Kuznetsov <vkuznets@redhat.com>
Wed, 24 Jan 2018 13:23:31 +0000 (14:23 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Tue, 30 Jan 2018 22:55:32 +0000 (23:55 +0100)
In hyperv_init() its presumed that it always has access to VP index and
hypercall MSRs while according to the specification it should be checked if
it's allowed to access the corresponding MSRs before accessing them.

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Stephen Hemminger <sthemmin@microsoft.com>
Cc: kvm@vger.kernel.org
Cc: Radim Krčmář <rkrcmar@redhat.com>
Cc: Haiyang Zhang <haiyangz@microsoft.com>
Cc: "Michael Kelley (EOSG)" <Michael.H.Kelley@microsoft.com>
Cc: Roman Kagan <rkagan@virtuozzo.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: devel@linuxdriverproject.org
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Cathy Avery <cavery@redhat.com>
Cc: Mohammed Gamal <mmorsy@redhat.com>
Link: https://lkml.kernel.org/r/20180124132337.30138-2-vkuznets@redhat.com
arch/x86/hyperv/hv_init.c

index 189a398290dbb220dcff2bcaa6ef4ebc1ef25ae3..21f9d53d9f00432f59cab940e329ac2d7e2209c4 100644 (file)
@@ -110,12 +110,19 @@ static int hv_cpu_init(unsigned int cpu)
  */
 void hyperv_init(void)
 {
-       u64 guest_id;
+       u64 guest_id, required_msrs;
        union hv_x64_msr_hypercall_contents hypercall_msr;
 
        if (x86_hyper_type != X86_HYPER_MS_HYPERV)
                return;
 
+       /* Absolutely required MSRs */
+       required_msrs = HV_X64_MSR_HYPERCALL_AVAILABLE |
+               HV_X64_MSR_VP_INDEX_AVAILABLE;
+
+       if ((ms_hyperv.features & required_msrs) != required_msrs)
+               return;
+
        /* Allocate percpu VP index */
        hv_vp_index = kmalloc_array(num_possible_cpus(), sizeof(*hv_vp_index),
                                    GFP_KERNEL);