From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47822) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WAMYn-0005qV-Tv for qemu-devel@nongnu.org; Mon, 03 Feb 2014 11:39:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WAMYf-0006LE-FF for qemu-devel@nongnu.org; Mon, 03 Feb 2014 11:39:49 -0500 Received: from mail-ea0-x230.google.com ([2a00:1450:4013:c01::230]:33795) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WAMYf-0006L9-8L for qemu-devel@nongnu.org; Mon, 03 Feb 2014 11:39:41 -0500 Received: by mail-ea0-f176.google.com with SMTP id h14so3785186eaj.21 for ; Mon, 03 Feb 2014 08:39:40 -0800 (PST) Received: from playground.lan (net-37-117-154-249.cust.vodafonedsl.it. [37.117.154.249]) by mx.google.com with ESMTPSA id b41sm77258410eef.16.2014.02.03.08.39.38 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 03 Feb 2014 08:39:39 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 3 Feb 2014 17:39:05 +0100 Message-Id: <1391445551-6561-11-git-send-email-pbonzini@redhat.com> In-Reply-To: <1391445551-6561-1-git-send-email-pbonzini@redhat.com> References: <1391445551-6561-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PULL 10/16] kvm: make availability of Hyper-V enlightenments dependent on KVM_CAP_HYPERV List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org The MS docs specify HV_X64_MSR_HYPERCALL as a mandatory interface, thus we must provide the MSRs even if the user only specified features that, like relaxed timing, in principle don't require them. And the MSRs are only there if the hypervisor has KVM_CAP_HYPERV. Signed-off-by: Paolo Bonzini --- target-i386/kvm.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/target-i386/kvm.c b/target-i386/kvm.c index 5738911..e6831b2 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -72,6 +72,8 @@ static bool has_msr_misc_enable; static bool has_msr_bndcfgs; static bool has_msr_kvm_steal_time; static int lm_capable_kernel; +static bool has_msr_hv_hypercall; +static bool has_msr_hv_vapic; static bool has_msr_architectural_pmu; static uint32_t num_architectural_pmu_counters; @@ -437,8 +439,10 @@ static bool hyperv_hypercall_available(X86CPU *cpu) static bool hyperv_enabled(X86CPU *cpu) { - return hyperv_hypercall_available(cpu) || - cpu->hyperv_relaxed_timing; + CPUState *cs = CPU(cpu); + return kvm_check_extension(cs->kvm_state, KVM_CAP_HYPERV) > 0 && + (hyperv_hypercall_available(cpu) || + cpu->hyperv_relaxed_timing); } #define KVM_MAX_CPUID_ENTRIES 100 @@ -493,6 +497,7 @@ int kvm_arch_init_vcpu(CPUState *cs) if (cpu->hyperv_vapic) { c->eax |= HV_X64_MSR_HYPERCALL_AVAILABLE; c->eax |= HV_X64_MSR_APIC_ACCESS_AVAILABLE; + has_msr_hv_vapic = true; } c = &cpuid_data.entries[cpuid_i++]; @@ -500,7 +505,7 @@ int kvm_arch_init_vcpu(CPUState *cs) if (cpu->hyperv_relaxed_timing) { c->eax |= HV_X64_RELAXED_TIMING_RECOMMENDED; } - if (cpu->hyperv_vapic) { + if (has_msr_hv_vapic) { c->eax |= HV_X64_APIC_ACCESS_RECOMMENDED; } c->ebx = cpu->hyperv_spinlock_attempts; @@ -511,6 +516,7 @@ int kvm_arch_init_vcpu(CPUState *cs) c->ebx = 0x40; kvm_base = KVM_CPUID_SIGNATURE_NEXT; + has_msr_hv_hypercall = true; } memcpy(signature, "KVMKVMKVM\0\0\0", 12); @@ -1223,11 +1229,11 @@ static int kvm_put_msrs(X86CPU *cpu, int level) kvm_msr_entry_set(&msrs[n++], MSR_CORE_PERF_GLOBAL_CTRL, env->msr_global_ctrl); } - if (hyperv_hypercall_available(cpu)) { + if (has_msr_hv_hypercall) { kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_GUEST_OS_ID, 0); kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_HYPERCALL, 0); } - if (cpu->hyperv_vapic) { + if (has_msr_hv_vapic) { kvm_msr_entry_set(&msrs[n++], HV_X64_MSR_APIC_ASSIST_PAGE, 0); } -- 1.8.3.1