qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v6 06/16] target-i386: Use Hypervisor level in -


From: Don Slutz
Subject: Re: [Qemu-devel] [PATCH v6 06/16] target-i386: Use Hypervisor level in -machine pc, accel=tcg.
Date: Wed, 10 Oct 2012 09:07:17 -0400
User-agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:15.0) Gecko/20120907 Thunderbird/15.0.1

On 10/09/12 15:01, Marcelo Tosatti wrote:
On Mon, Sep 24, 2012 at 10:32:08AM -0400, Don Slutz wrote:
Also known as Paravirtualization level.

This change is based on:

Microsoft Hypervisor CPUID Leaves:
   
http://msdn.microsoft.com/en-us/library/windows/hardware/ff542428%28v=vs.85%29.aspx

Linux kernel change starts with:
   http://fixunix.com/kernel/538707-use-cpuid-communicate-hypervisor.html
Also:
   http://lkml.indiana.edu/hypermail/linux/kernel/1205.0/00100.html

VMware documention on CPUIDs (Mechanisms to determine if software is
running in a VMware virtual machine):
   
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458

QEMU knows this as KVM_CPUID_SIGNATURE (0x40000000) in kvm on linux.

This does not provide vendor support in tcg yet.

Signed-off-by: Don Slutz <address@hidden>
---
  target-i386/cpu.c |   27 +++++++++++++++++++++++++++
  1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/target-i386/cpu.c b/target-i386/cpu.c
index 48bdaf9..920278b 100644
--- a/target-i386/cpu.c
+++ b/target-i386/cpu.c
@@ -1651,6 +1651,21 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
                  index =  env->cpuid_xlevel;
              }
          }
+    } else if (index & 0x40000000) {
+        if (env->cpuid_hv_level_set) {
+            uint32_t real_level = env->cpuid_hv_level;
+
+            /* Handle Hypervisor CPUIDs */
+            if (real_level < 0x40000000) {
+                real_level = 0x40000000;
+            }
+            if (index > real_level) {
+                index = real_level;
+            }
+        } else {
+            if (index > env->cpuid_level)
+                index = env->cpuid_level;
+        }
Whats the purpose of this checks?
They control what happens for CPUID requests outside the defined ranges. Very similar to code just above this.

Please provide changelogs for each patch.
In progress.
      } else {
          if (index > env->cpuid_level)
              index = env->cpuid_level;
@@ -1789,6 +1804,18 @@ void cpu_x86_cpuid(CPUX86State *env, uint32_t index, 
uint32_t count,
              *edx = 0;
          }
          break;
+    case 0x40000000:
+        *eax = env->cpuid_hv_level;
+        *ebx = 0;
+        *ecx = 0;
+        *edx = 0;
+        break;
+    case 0x40000001:
+        *eax = env->cpuid_kvm_features;
+        *ebx = 0;
+        *ecx = 0;
+        *edx = 0;
+        break;
      case 0x80000000:
          *eax = env->cpuid_xlevel;
          *ebx = env->cpuid_vendor1;
--
1.7.1

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to address@hidden
More majordomo info at  http://vger.kernel.org/majordomo-info.html
   -Don Slutz



reply via email to

[Prev in Thread] Current Thread [Next in Thread]