From d979114499983e408dc372a3074d9c2dcb9939cb Mon Sep 17 00:00:00 2001
Message-Id: <d979114499983e408dc372a3074d9c2dcb9939cb.1349175436.git.minovotn@redhat.com>
In-Reply-To: <94968b7fa9b14e71f004474d7ce77e189e6a2bf3.1349175436.git.minovotn@redhat.com>
References: <94968b7fa9b14e71f004474d7ce77e189e6a2bf3.1349175436.git.minovotn@redhat.com>
From: Eduardo Habkost <ehabkost@redhat.com>
Date: Fri, 28 Sep 2012 16:50:20 +0200
Subject: [PATCH 15/34] kvm: expose tsc deadline timer feature to guest

RH-Author: Eduardo Habkost <ehabkost@redhat.com>
Message-id: <1348851023-31907-16-git-send-email-ehabkost@redhat.com>
Patchwork-id: 42519
O-Subject: [RHEL6 qemu-kvm PATCH 15/18] kvm: expose tsc deadline timer feature to guest
Bugzilla: 767944
RH-Acked-by: Alex Williamson <alex.williamson@redhat.com>
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
RH-Acked-by: Orit Wasserman <owasserm@redhat.com>
RH-Acked-by: Eduardo Habkost <ehabkost@redhat.com>

From: "ddugger@redhat.com" <ddugger@redhat.com>

Bugzilla: 767944
Upstream status: commit a75b3e0f641a68b7cdd4bbe4ed1b60f963bf2b62

Upstream commit description:

commit a75b3e0f641a68b7cdd4bbe4ed1b60f963bf2b62
Author: Liu, Jinsong <jinsong.liu@intel.com>
Date:   Tue Jul 3 02:35:10 2012 +0800

    kvm: expose tsc deadline timer feature to guest

    This patch exposes tsc deadline timer feature to guest if
    1). in-kernel irqchip is used, and
    2). kvm has emulated tsc deadline timer, and
    3). user authorize the feature exposing via -cpu or +/- tsc-deadline

    Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>
    Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
    Acked-by: Jan Kiszka <jan.kiszka@siemens.com>
    Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>

In qemu-kvm upstream, cpuid expose via
  target-i386/kvm.c --> kvm_arch_init_vcpu(),
while for RHEL6.4 rebase, cpuid expose via
  qemu-kvm-x86.c --> kvm_arch_init_vcpu().

This patch backport tsc deadline timer cpuid exposing logic to
qemu-kvm-x86.c.

[ehabkost: edited commit message to include pointer to upstream commit]

Signed-off-by: Liu, Jinsong <jinsong.liu@intel.com>
Signed-off-by: Don Dugger <donald.d.dugger@intel.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
---
 kvm/include/linux/kvm.h | 1 +
 qemu-kvm-x86.c          | 5 +++++
 2 files changed, 6 insertions(+)

Signed-off-by: Michal Novotny <minovotn@redhat.com>
---
 kvm/include/linux/kvm.h | 1 +
 qemu-kvm-x86.c          | 5 +++++
 2 files changed, 6 insertions(+)

diff --git a/kvm/include/linux/kvm.h b/kvm/include/linux/kvm.h
index f566e7b..4484c47 100644
--- a/kvm/include/linux/kvm.h
+++ b/kvm/include/linux/kvm.h
@@ -530,6 +530,7 @@ struct kvm_enable_cap {
 #ifdef __KVM_HAVE_XCRS
 #define KVM_CAP_XCRS 56
 #endif
+#define KVM_CAP_TSC_DEADLINE_TIMER 72
 #define KVM_CAP_KVMCLOCK_CTRL 76
 
 #ifdef KVM_CAP_IRQ_ROUTING
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c
index 59d32f1..edacf95 100644
--- a/qemu-kvm-x86.c
+++ b/qemu-kvm-x86.c
@@ -1409,9 +1409,14 @@ int kvm_arch_init_vcpu(CPUState *cenv)
 
     /* prevent the hypervisor bit from being cleared by the kernel */
     i = cenv->cpuid_ext_features & CPUID_EXT_HYPERVISOR;
+    j = cenv->cpuid_ext_features & CPUID_EXT_TSC_DEADLINE_TIMER;
     kvm_trim_features(&cenv->cpuid_ext_features,
                       kvm_arch_get_supported_cpuid(cenv->kvm_state, 1, 0, R_ECX));
     cenv->cpuid_ext_features |= i;
+    if (j && kvm_irqchip_in_kernel() &&
+        kvm_check_extension(cenv->kvm_state, KVM_CAP_TSC_DEADLINE_TIMER)) {
+        cenv->cpuid_ext_features |= CPUID_EXT_TSC_DEADLINE_TIMER;
+    }
 
     kvm_trim_features(&cenv->cpuid_ext2_features,
                       kvm_arch_get_supported_cpuid(cenv->kvm_state, 0x80000001, 0, R_EDX));
-- 
1.7.11.4

