From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60649) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDbun-0004Rt-Cl for qemu-devel@nongnu.org; Mon, 17 Sep 2012 10:03:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TDbuf-0004ea-CR for qemu-devel@nongnu.org; Mon, 17 Sep 2012 10:03:09 -0400 Received: from hub021-nj-8.exch021.serverdata.net ([206.225.164.233]:6595) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TDbuf-0004eH-9C for qemu-devel@nongnu.org; Mon, 17 Sep 2012 10:03:01 -0400 From: Don Slutz Date: Mon, 17 Sep 2012 10:01:05 -0400 Message-ID: <1347890467-9728-16-git-send-email-Don@CloudSwitch.com> In-Reply-To: <1346354435-21685-1-git-send-email-Don@CloudSwitch.com> References: <1346354435-21685-1-git-send-email-Don@CloudSwitch.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH v3 15/17] target-i386: Add setting of Hypervisor leaf extra for known vmare4. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, mtosatti@redhat.com, ehabkost@redhat.com, imammedo@redhat.com, avi@redhat.com, afaerber@suse.de, peter.maydell@linaro.org, kvm@vger.kernel.org, anthony@codemonkey.ws Cc: Don Slutz This was taken from: http://article.gmane.org/gmane.comp.emulators.kvm.devel/22643 Signed-off-by: Don Slutz --- target-i386/cpu.c | 32 ++++++++++++++++++++++++++++++++ 1 files changed, 32 insertions(+), 0 deletions(-) diff --git a/target-i386/cpu.c b/target-i386/cpu.c index 34d2291..bfaee02 100644 --- a/target-i386/cpu.c +++ b/target-i386/cpu.c @@ -1135,6 +1135,36 @@ static void x86_cpuid_set_model_id(Object *obj, const char *model_id, } } +static void x86_cpuid_set_vmware_extra(Object *obj) +{ + X86CPU *cpu = X86_CPU(obj); + + if ((cpu->env.tsc_khz != 0) && + (cpu->env.cpuid_hv_level == CPUID_HV_LEVEL_VMARE_4) && + (cpu->env.cpuid_hv_vendor1 == CPUID_HV_VENDOR_VMWARE_1) && + (cpu->env.cpuid_hv_vendor2 == CPUID_HV_VENDOR_VMWARE_2) && + (cpu->env.cpuid_hv_vendor3 == CPUID_HV_VENDOR_VMWARE_3)) { + const uint32_t apic_khz = 1000000L; + + /* + * From article.gmane.org/gmane.comp.emulators.kvm.devel/22643 + * + * Leaf 0x40000010, Timing Information. + * + * VMware has defined the first generic leaf to provide timing + * information. This leaf returns the current TSC frequency and + * current Bus frequency in kHz. + * + * # EAX: (Virtual) TSC frequency in kHz. + * # EBX: (Virtual) Bus (local apic timer) frequency in kHz. + * # ECX, EDX: RESERVED (Per above, reserved fields are set to zero). + */ + cpu->env.cpuid_hv_extra = 0x40000010; + cpu->env.cpuid_hv_extra_a = (uint32_t)cpu->env.tsc_khz; + cpu->env.cpuid_hv_extra_b = apic_khz; + } +} + static void x86_cpuid_get_tsc_freq(Object *obj, Visitor *v, void *opaque, const char *name, Error **errp) { @@ -1164,6 +1194,7 @@ static void x86_cpuid_set_tsc_freq(Object *obj, Visitor *v, void *opaque, } cpu->env.tsc_khz = value / 1000; + x86_cpuid_set_vmware_extra(obj); } static void x86_cpuid_get_hv_level(Object *obj, Visitor *v, void *opaque, @@ -1263,6 +1294,7 @@ static void x86_cpuid_set_hv_vendor(Object *obj, const char *value, env->cpuid_hv_vendor2 |= ((uint8_t)adj_value[i + 4]) << (8 * i); env->cpuid_hv_vendor3 |= ((uint8_t)adj_value[i + 8]) << (8 * i); } + x86_cpuid_set_vmware_extra(obj); } static void x86_cpuid_get_hv_extra(Object *obj, Visitor *v, void *opaque, -- 1.7.1