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 <d...@cloudswitch.com>
---
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 majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
-Don Slutz