diff options
author | Avi Kivity <avi@redhat.com> | 2010-06-01 15:33:47 +0300 |
---|---|---|
committer | Marcelo Tosatti <mtosatti@redhat.com> | 2010-06-02 13:23:14 -0300 |
commit | 2a3e62cce60e7f4e4a4e7bb2b637eccda328f9c1 (patch) | |
tree | f4c0fab7251ae65ae102f87670db52eed6871e3f /qemu-kvm-x86.c | |
parent | bcf49f2c805d0091b95de5bfdca38a84bb0ed927 (diff) |
Use upstream's kvm_arch_init_vcpu()'s cpuid bits
Signed-off-by: Avi Kivity <avi@redhat.com>
Acked-by: Glauber Costa <glommer@redhat.com>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'qemu-kvm-x86.c')
-rw-r--r-- | qemu-kvm-x86.c | 104 |
1 files changed, 0 insertions, 104 deletions
diff --git a/qemu-kvm-x86.c b/qemu-kvm-x86.c index 853d50ee5..3c33e6453 100644 --- a/qemu-kvm-x86.c +++ b/qemu-kvm-x86.c @@ -1101,114 +1101,10 @@ void kvm_arch_save_regs(CPUState *env) kvm_get_debugregs(env); } -static void do_cpuid_ent(struct kvm_cpuid_entry2 *e, uint32_t function, - uint32_t count, CPUState *env) -{ - env->regs[R_EAX] = function; - env->regs[R_ECX] = count; - qemu_kvm_cpuid_on_env(env); - e->function = function; - e->flags = 0; - e->index = 0; - e->eax = env->regs[R_EAX]; - e->ebx = env->regs[R_EBX]; - e->ecx = env->regs[R_ECX]; - e->edx = env->regs[R_EDX]; -} - -static void kvm_trim_features(uint32_t *features, uint32_t supported) -{ - int i; - uint32_t mask; - - for (i = 0; i < 32; ++i) { - mask = 1U << i; - if ((*features & mask) && !(supported & mask)) { - *features &= ~mask; - } - } -} - static int _kvm_arch_init_vcpu(CPUState *env) { - struct kvm_cpuid_entry2 cpuid_ent[100]; -#ifdef KVM_CPUID_SIGNATURE - struct kvm_cpuid_entry2 *pv_ent; - uint32_t signature[3]; -#endif - int cpuid_nent = 0; - CPUState copy; - uint32_t i, j, limit; - kvm_arch_reset_vcpu(env); -#ifdef KVM_CPUID_SIGNATURE - /* Paravirtualization CPUIDs */ - memcpy(signature, "KVMKVMKVM\0\0\0", 12); - pv_ent = &cpuid_ent[cpuid_nent++]; - memset(pv_ent, 0, sizeof(*pv_ent)); - pv_ent->function = KVM_CPUID_SIGNATURE; - pv_ent->eax = 0; - pv_ent->ebx = signature[0]; - pv_ent->ecx = signature[1]; - pv_ent->edx = signature[2]; - - pv_ent = &cpuid_ent[cpuid_nent++]; - memset(pv_ent, 0, sizeof(*pv_ent)); - pv_ent->function = KVM_CPUID_FEATURES; - pv_ent->eax = get_para_features(env); -#endif - - kvm_trim_features(&env->cpuid_features, - kvm_arch_get_supported_cpuid(env, 1, R_EDX)); - - /* prevent the hypervisor bit from being cleared by the kernel */ - i = env->cpuid_ext_features & CPUID_EXT_HYPERVISOR; - kvm_trim_features(&env->cpuid_ext_features, - kvm_arch_get_supported_cpuid(env, 1, R_ECX)); - env->cpuid_ext_features |= i; - - kvm_trim_features(&env->cpuid_ext2_features, - kvm_arch_get_supported_cpuid(env, 0x80000001, R_EDX)); - kvm_trim_features(&env->cpuid_ext3_features, - kvm_arch_get_supported_cpuid(env, 0x80000001, R_ECX)); - - copy = *env; - - copy.regs[R_EAX] = 0; - qemu_kvm_cpuid_on_env(©); - limit = copy.regs[R_EAX]; - - for (i = 0; i <= limit; ++i) { - if (i == 4 || i == 0xb || i == 0xd) { - for (j = 0; ; ++j) { - do_cpuid_ent(&cpuid_ent[cpuid_nent], i, j, ©); - - cpuid_ent[cpuid_nent].flags = KVM_CPUID_FLAG_SIGNIFCANT_INDEX; - cpuid_ent[cpuid_nent].index = j; - - cpuid_nent++; - - if (i == 4 && copy.regs[R_EAX] == 0) - break; - if (i == 0xb && !(copy.regs[R_ECX] & 0xff00)) - break; - if (i == 0xd && copy.regs[R_EAX] == 0) - break; - } - } else - do_cpuid_ent(&cpuid_ent[cpuid_nent++], i, 0, ©); - } - - 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, 0, ©); - - kvm_setup_cpuid2(env, cpuid_nent, cpuid_ent); - #ifdef KVM_CAP_MCE if (((env->cpuid_version >> 8)&0xF) >= 6 && (env->cpuid_features&(CPUID_MCE|CPUID_MCA)) == (CPUID_MCE|CPUID_MCA) |