From: aliguori Date: Mon, 9 Feb 2009 15:50:36 +0000 (+0000) Subject: KVM: Get all cpuid values from function 2 (Amit Shah) X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=a36b1029e226f377028aeab0e8779fcd4c3e414e;p=xenclient%2Fioemu.git KVM: Get all cpuid values from function 2 (Amit Shah) cpuid function 2 can have multiple values to describe cache behaviour. Loop till we have fetched all the values. Signed-off-by: Amit Shah Signed-off-by: Anthony Liguori git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6567 c046a42c-6fe2-441c-8c8c-71466251a162 --- diff --git a/target-i386/kvm.c b/target-i386/kvm.c index a7ff14fa..19b08d80 100644 --- a/target-i386/kvm.c +++ b/target-i386/kvm.c @@ -51,6 +51,32 @@ int kvm_arch_init_vcpu(CPUState *env) struct kvm_cpuid_entry2 *c = &cpuid_data.entries[cpuid_i++]; switch (i) { + case 2: { + /* Keep reading function 2 till all the input is received */ + int times; + + cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx); + times = eax & 0xff; + + c->function = i; + c->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC; + c->flags |= KVM_CPUID_FLAG_STATE_READ_NEXT; + c->eax = eax; + c->ebx = ebx; + c->ecx = ecx; + c->edx = edx; + + for (j = 1; j < times; ++j) { + cpu_x86_cpuid(env, i, 0, &eax, &ebx, &ecx, &edx); + c->function = i; + c->flags |= KVM_CPUID_FLAG_STATEFUL_FUNC; + c->eax = eax; + c->ebx = ebx; + c->ecx = ecx; + c->edx = edx; + } + break; + } case 4: case 0xb: case 0xd: