mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
kvm: Consolidate must-have capability checks
Instead of splattering the code with #ifdefs and runtime checks for capabilities we cannot work without anyway, provide central test infrastructure for verifying their availability both at build and runtime. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:
parent
cad1e2827b
commit
94a8d39afd
6 changed files with 80 additions and 85 deletions
|
@ -54,12 +54,17 @@
|
|||
#define BUS_MCEERR_AO 5
|
||||
#endif
|
||||
|
||||
const KVMCapabilityInfo kvm_arch_required_capabilities[] = {
|
||||
KVM_CAP_INFO(SET_TSS_ADDR),
|
||||
KVM_CAP_INFO(EXT_CPUID),
|
||||
KVM_CAP_INFO(MP_STATE),
|
||||
KVM_CAP_LAST_INFO
|
||||
};
|
||||
|
||||
static bool has_msr_star;
|
||||
static bool has_msr_hsave_pa;
|
||||
static int lm_capable_kernel;
|
||||
|
||||
#ifdef KVM_CAP_EXT_CPUID
|
||||
|
||||
static struct kvm_cpuid2 *try_get_cpuid(KVMState *s, int max)
|
||||
{
|
||||
struct kvm_cpuid2 *cpuid;
|
||||
|
@ -93,10 +98,6 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
|
|||
uint32_t ret = 0;
|
||||
uint32_t cpuid_1_edx;
|
||||
|
||||
if (!kvm_check_extension(env->kvm_state, KVM_CAP_EXT_CPUID)) {
|
||||
return -1U;
|
||||
}
|
||||
|
||||
max = 1;
|
||||
while ((cpuid = try_get_cpuid(env->kvm_state, max)) == NULL) {
|
||||
max *= 2;
|
||||
|
@ -140,30 +141,14 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function,
|
||||
uint32_t index, int reg)
|
||||
{
|
||||
return -1U;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KVM_PARA
|
||||
struct kvm_para_features {
|
||||
int cap;
|
||||
int feature;
|
||||
} para_features[] = {
|
||||
#ifdef KVM_CAP_CLOCKSOURCE
|
||||
{ KVM_CAP_CLOCKSOURCE, KVM_FEATURE_CLOCKSOURCE },
|
||||
#endif
|
||||
#ifdef KVM_CAP_NOP_IO_DELAY
|
||||
{ KVM_CAP_NOP_IO_DELAY, KVM_FEATURE_NOP_IO_DELAY },
|
||||
#endif
|
||||
#ifdef KVM_CAP_PV_MMU
|
||||
{ KVM_CAP_PV_MMU, KVM_FEATURE_MMU_OP },
|
||||
#endif
|
||||
#ifdef KVM_CAP_ASYNC_PF
|
||||
{ KVM_CAP_ASYNC_PF, KVM_FEATURE_ASYNC_PF },
|
||||
#endif
|
||||
|
@ -542,15 +527,7 @@ int kvm_arch_init(KVMState *s)
|
|||
|
||||
/* create vm86 tss. KVM uses vm86 mode to emulate 16-bit code
|
||||
* directly. In order to use vm86 mode, a TSS is needed. Since this
|
||||
* must be part of guest physical memory, we need to allocate it. Older
|
||||
* versions of KVM just assumed that it would be at the end of physical
|
||||
* memory but that doesn't work with more than 4GB of memory. We simply
|
||||
* refuse to work with those older versions of KVM. */
|
||||
ret = kvm_check_extension(s, KVM_CAP_SET_TSS_ADDR);
|
||||
if (ret <= 0) {
|
||||
fprintf(stderr, "kvm does not support KVM_CAP_SET_TSS_ADDR\n");
|
||||
return ret;
|
||||
}
|
||||
* must be part of guest physical memory, we need to allocate it. */
|
||||
|
||||
/* this address is 3 pages before the bios, and the bios should present
|
||||
* as unavaible memory. FIXME, need to ensure the e820 map deals with
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue