0a122b
From 4e424b837ade87f4d44cbd51e8994e4ac8f36515 Mon Sep 17 00:00:00 2001
0a122b
From: Vadim Rozenfeld <vrozenfe@redhat.com>
0a122b
Date: Mon, 3 Mar 2014 12:09:16 +0100
0a122b
Subject: [PATCH 04/12] kvm: make availability of Hyper-V enlightenments dependent on KVM_CAP_HYPERV
0a122b
0a122b
RH-Author: Vadim Rozenfeld <vrozenfe@redhat.com>
0a122b
Message-id: <1393848564-10511-5-git-send-email-vrozenfe@redhat.com>
0a122b
Patchwork-id: 57960
0a122b
O-Subject: [RHEL-7.0 qemu-kvm v4 PATCH 04/12] kvm: make availability of Hyper-V enlightenments dependent on KVM_CAP_HYPERV
0a122b
Bugzilla: 1004773
0a122b
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
0a122b
RH-Acked-by: Juan Quintela <quintela@redhat.com>
0a122b
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>
0a122b
0a122b
From: Paolo Bonzini <pbonzini@redhat.com>
0a122b
0a122b
The MS docs specify HV_X64_MSR_HYPERCALL as a mandatory interface,
0a122b
thus we must provide the MSRs even if the user only specified
0a122b
features that, like relaxed timing, in principle don't require them.
0a122b
And the MSRs are only there if the hypervisor has KVM_CAP_HYPERV.
0a122b
0a122b
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
(cherry picked from commit 7bc3d711b45d6feacab96eda410c5655f4ddafcf)
0a122b
---
0a122b
 target-i386/kvm.c | 16 +++++++++++-----
0a122b
 1 file changed, 11 insertions(+), 5 deletions(-)
0a122b
0a122b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
---
0a122b
 target-i386/kvm.c |   16 +++++++++++-----
0a122b
 1 files changed, 11 insertions(+), 5 deletions(-)
0a122b
0a122b
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
0a122b
index 3688371..495021b 100644
0a122b
--- a/target-i386/kvm.c
0a122b
+++ b/target-i386/kvm.c
0a122b
@@ -70,6 +70,8 @@ static bool has_msr_pv_eoi_en;
0a122b
 static bool has_msr_misc_enable;
0a122b
 static bool has_msr_kvm_steal_time;
0a122b
 static int lm_capable_kernel;
0a122b
+static bool has_msr_hv_hypercall;
0a122b
+static bool has_msr_hv_vapic;
0a122b
 
0a122b
 static bool has_msr_architectural_pmu;
0a122b
 static uint32_t num_architectural_pmu_counters;
0a122b
@@ -433,8 +435,10 @@ static bool hyperv_hypercall_available(X86CPU *cpu)
0a122b
 
0a122b
 static bool hyperv_enabled(X86CPU *cpu)
0a122b
 {
0a122b
-    return hyperv_hypercall_available(cpu) ||
0a122b
-           cpu->hyperv_relaxed_timing;
0a122b
+    CPUState *cs = CPU(cpu);
0a122b
+    return kvm_check_extension(cs->kvm_state, KVM_CAP_HYPERV) > 0 &&
0a122b
+           (hyperv_hypercall_available(cpu) ||
0a122b
+            cpu->hyperv_relaxed_timing);
0a122b
 }
0a122b
 
0a122b
 #define KVM_MAX_CPUID_ENTRIES  100
0a122b
@@ -489,6 +493,7 @@ int kvm_arch_init_vcpu(CPUState *cs)
0a122b
         if (cpu->hyperv_vapic) {
0a122b
             c->eax |= HV_X64_MSR_HYPERCALL_AVAILABLE;
0a122b
             c->eax |= HV_X64_MSR_APIC_ACCESS_AVAILABLE;
0a122b
+            has_msr_hv_vapic = true;
0a122b
         }
0a122b
 
0a122b
         c = &cpuid_data.entries[cpuid_i++];
0a122b
@@ -496,7 +501,7 @@ int kvm_arch_init_vcpu(CPUState *cs)
0a122b
         if (cpu->hyperv_relaxed_timing) {
0a122b
             c->eax |= HV_X64_RELAXED_TIMING_RECOMMENDED;
0a122b
         }
0a122b
-        if (cpu->hyperv_vapic) {
0a122b
+        if (has_msr_hv_vapic) {
0a122b
             c->eax |= HV_X64_APIC_ACCESS_RECOMMENDED;
0a122b
         }
0a122b
         c->ebx = cpu->hyperv_spinlock_attempts;
0a122b
@@ -507,6 +512,7 @@ int kvm_arch_init_vcpu(CPUState *cs)
0a122b
         c->ebx = 0x40;
0a122b
 
0a122b
         kvm_base = KVM_CPUID_SIGNATURE_NEXT;
0a122b
+        has_msr_hv_hypercall = true;
0a122b
     }
0a122b
 
0a122b
     memcpy(signature, "KVMKVMKVM\0\0\0", 12);
0a122b
@@ -1191,11 +1197,11 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
0a122b
             kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_GLOBAL_CTRL,
0a122b
                               env->msr_global_ctrl);
0a122b
         }
0a122b
-        if (hyperv_hypercall_available(cpu)) {
0a122b
+        if (has_msr_hv_hypercall) {
0a122b
             kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_GUEST_OS_ID, 0);
0a122b
             kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_HYPERCALL, 0);
0a122b
         }
0a122b
-        if (cpu->hyperv_vapic) {
0a122b
+        if (has_msr_hv_vapic) {
0a122b
             kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_APIC_ASSIST_PAGE, 0);
0a122b
         }
0a122b
     }
0a122b
-- 
0a122b
1.7.1
0a122b