9d45f1936c
git-svn-id: https://svn.disconnected-by-peer.at/svn/linamh/trunk/linamh@713 6952d904-891a-0410-993b-d76249ca496b
59 lines
1.8 KiB
Diff
59 lines
1.8 KiB
Diff
# Quick patch until proper version is upstream, but is safe.
|
|
# Signed-off-by: Alex Graf - agraf@suse
|
|
Index: kvm-75/qemu/qemu-kvm-x86.c
|
|
===================================================================
|
|
--- kvm-75.orig/qemu/qemu-kvm-x86.c
|
|
+++ kvm-75/qemu/qemu-kvm-x86.c
|
|
@@ -465,10 +465,11 @@ static void host_cpuid(uint32_t function
|
|
}
|
|
|
|
|
|
-static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function,
|
|
+static void do_cpuid_ent(struct kvm_cpuid_entry *e, uint32_t function, uint32_t index,
|
|
CPUState *env)
|
|
{
|
|
env->regs[R_EAX] = function;
|
|
+ env->regs[R_ECX] = index;
|
|
qemu_kvm_cpuid_on_env(env);
|
|
e->function = function;
|
|
e->eax = env->regs[R_EAX];
|
|
@@ -554,7 +555,7 @@ int kvm_arch_qemu_init_env(CPUState *cen
|
|
#endif
|
|
int cpuid_nent = 0;
|
|
CPUState copy;
|
|
- uint32_t i, limit;
|
|
+ uint32_t i, j, limit;
|
|
|
|
copy = *cenv;
|
|
|
|
@@ -579,15 +580,26 @@ int kvm_arch_qemu_init_env(CPUState *cen
|
|
qemu_kvm_cpuid_on_env(©);
|
|
limit = copy.regs[R_EAX];
|
|
|
|
- for (i = 0; i <= limit; ++i)
|
|
- do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, ©);
|
|
+ for (i = 0; i <= limit; ++i) {
|
|
+ switch(i) {
|
|
+ case 4:
|
|
+ for(j = 0; ; j++) {
|
|
+ do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, j, ©);
|
|
+ if(!copy.regs[R_EAX]) break;
|
|
+ }
|
|
+ break;
|
|
+ default:
|
|
+ do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
|
|
copy.regs[R_EAX] = 0x80000000;
|
|
qemu_kvm_cpuid_on_env(©);
|
|
limit = copy.regs[R_EAX];
|
|
|
|
for (i = 0x80000000; i <= limit; ++i)
|
|
- do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, ©);
|
|
+ do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©);
|
|
|
|
kvm_setup_cpuid(kvm_context, cenv->cpu_index, cpuid_nent, cpuid_ent);
|
|
return 0;
|