@@ -538,7 +538,27 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
limit = copy.regs[R_EAX];
for (i = 0; i <= limit; ++i) {
- if (i == 4 || i == 0xb || i == 0xd) {
+ switch (i) {
+ case 2: {
+ /* Keep reading function 2 till all the input is received */
+ int times;
+
+ do_cpuid_ent(&cpuid_ent[cpuid_nent], i, 0, ©);
+ times = cpuid_ent[cpuid_nent].eax & 0xff;
+
+ cpuid_ent[cpuid_nent].flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
+ cpuid_ent[cpuid_nent].flags |= KVM_CPUID_FLAG_STATE_READ_NEXT;
+
+ for (j = 1; j < times; ++j) {
+ do_cpuid_ent(&cpuid_ent[++cpuid_nent], i, 0, ©);
+ cpuid_ent[cpuid_nent].flags |= KVM_CPUID_FLAG_STATEFUL_FUNC;
+ }
+ cpuid_nent++;
+ break;
+ }
+ case 4:
+ case 0xb:
+ case 0xd:
for (j = 0; ; ++j) {
do_cpuid_ent(&cpuid_ent[cpuid_nent], i, j, ©);
@@ -554,8 +574,11 @@ int kvm_arch_qemu_init_env(CPUState *cenv)
if (i == 0xd && copy.regs[R_EAX] == 0)
break;
}
- } else
+ break;
+
+ default:
do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
+ }
}
copy.regs[R_EAX] = 0x80000000;
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> --- qemu/qemu-kvm-x86.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-)