diff options
author | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-02-09 15:50:36 +0000 |
---|---|---|
committer | aliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-02-09 15:50:36 +0000 |
commit | a36b1029e226f377028aeab0e8779fcd4c3e414e (patch) | |
tree | 27087d6cd95b1182f82d4b878a97f55c1d6cfd67 /target-i386 | |
parent | 486bd5a2f26e58d7222a0cb83f25bb4136b7406d (diff) |
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 <amit.shah@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6567 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/kvm.c | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/target-i386/kvm.c b/target-i386/kvm.c index a7ff14fa1c..19b08d8009 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: |