提交 c958a8bd 编写于 作者: S Sheng Yang 提交者: Marcelo Tosatti

kvm: Extend kvm_arch_get_supported_cpuid() to support index

Would use it later for XSAVE related CPUID.
Signed-off-by: NSheng Yang <sheng@linux.intel.com>
Signed-off-by: NMarcelo Tosatti <mtosatti@redhat.com>
上级 89354998
...@@ -144,7 +144,7 @@ bool kvm_arch_stop_on_emulation_error(CPUState *env); ...@@ -144,7 +144,7 @@ bool kvm_arch_stop_on_emulation_error(CPUState *env);
int kvm_check_extension(KVMState *s, unsigned int extension); int kvm_check_extension(KVMState *s, unsigned int extension);
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
int reg); uint32_t index, int reg);
void kvm_cpu_synchronize_state(CPUState *env); void kvm_cpu_synchronize_state(CPUState *env);
void kvm_cpu_synchronize_post_reset(CPUState *env); void kvm_cpu_synchronize_post_reset(CPUState *env);
void kvm_cpu_synchronize_post_init(CPUState *env); void kvm_cpu_synchronize_post_init(CPUState *env);
......
...@@ -71,7 +71,8 @@ static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max) ...@@ -71,7 +71,8 @@ static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
return cpuid; return cpuid;
} }
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg) uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
uint32_t index, int reg)
{ {
struct kvm_cpuid2 *cpuid; struct kvm_cpuid2 *cpuid;
int i, max; int i, max;
...@@ -88,7 +89,8 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg) ...@@ -88,7 +89,8 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)
} }
for (i = 0; i < cpuid->nent; ++i) { for (i = 0; i < cpuid->nent; ++i) {
if (cpuid->entries[i].function == function) { if (cpuid->entries[i].function == function &&
cpuid->entries[i].index == index) {
switch (reg) { switch (reg) {
case R_EAX: case R_EAX:
ret = cpuid->entries[i].eax; ret = cpuid->entries[i].eax;
...@@ -110,7 +112,7 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg) ...@@ -110,7 +112,7 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)
/* On Intel, kvm returns cpuid according to the Intel spec, /* On Intel, kvm returns cpuid according to the Intel spec,
* so add missing bits according to the AMD spec: * so add missing bits according to the AMD spec:
*/ */
cpuid_1_edx = kvm_arch_get_supported_cpuid(env, 1, R_EDX); cpuid_1_edx = kvm_arch_get_supported_cpuid(env, 1, 0, R_EDX);
ret |= cpuid_1_edx & 0x183f7ff; ret |= cpuid_1_edx & 0x183f7ff;
break; break;
} }
...@@ -126,7 +128,8 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg) ...@@ -126,7 +128,8 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)
#else #else
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg) uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
uint32_t index, int reg)
{ {
return -1U; return -1U;
} }
...@@ -178,16 +181,16 @@ int kvm_arch_init_vcpu(CPUState *env) ...@@ -178,16 +181,16 @@ int kvm_arch_init_vcpu(CPUState *env)
env->mp_state = KVM_MP_STATE_RUNNABLE; env->mp_state = KVM_MP_STATE_RUNNABLE;
env->cpuid_features &= kvm_arch_get_supported_cpuid(env, 1, R_EDX); env->cpuid_features &= kvm_arch_get_supported_cpuid(env, 1, 0, R_EDX);
i = env->cpuid_ext_features & CPUID_EXT_HYPERVISOR; i = env->cpuid_ext_features & CPUID_EXT_HYPERVISOR;
env->cpuid_ext_features &= kvm_arch_get_supported_cpuid(env, 1, R_ECX); env->cpuid_ext_features &= kvm_arch_get_supported_cpuid(env, 1, 0, R_ECX);
env->cpuid_ext_features |= i; env->cpuid_ext_features |= i;
env->cpuid_ext2_features &= kvm_arch_get_supported_cpuid(env, 0x80000001, env->cpuid_ext2_features &= kvm_arch_get_supported_cpuid(env, 0x80000001,
R_EDX); 0, R_EDX);
env->cpuid_ext3_features &= kvm_arch_get_supported_cpuid(env, 0x80000001, env->cpuid_ext3_features &= kvm_arch_get_supported_cpuid(env, 0x80000001,
R_ECX); 0, R_ECX);
cpuid_i = 0; cpuid_i = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册