Hyper-V identifies vCPUs by Virtual Processor (VP) index which can be queried by the guest via HV_X64_MSR_VP_INDEX msr. It is defined by the spec as a sequential number which can't exceed the maximum number of vCPUs per VM. It has to be owned by QEMU in order to preserve it across migration. However, the initial implementation in KVM didn't allow to set this msr, and KVM used its own notion of VP index. Fortunately, the way vCPUs are created in QEMU/KVM makes it likely that the KVM value is equal to QEMU cpu_index. So choose cpu_index as the value for vp_index, and push that to KVM on kernels that support setting the msr. On older ones that don't, query the kernel value and assert that it's in sync with QEMU. Besides, since handling errors from vCPU init at hotplug time is impossible, disable vCPU hotplug. This patch also introduces accessor functions to encapsulate the mapping between a vCPU and its vp_index. Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> Message-Id: <20180702134156.13404-3-rkagan@virtuozzo.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
48 lines
889 B
C
48 lines
889 B
C
/*
|
|
* QEMU KVM x86 specific function stubs
|
|
*
|
|
* Copyright Linaro Limited 2012
|
|
*
|
|
* Author: Peter Maydell <peter.maydell@linaro.org>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
#include "qemu/osdep.h"
|
|
#include "qemu-common.h"
|
|
#include "cpu.h"
|
|
#include "kvm_i386.h"
|
|
|
|
bool kvm_allows_irq0_override(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
#ifndef __OPTIMIZE__
|
|
bool kvm_has_smm(void)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
bool kvm_enable_x2apic(void)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
/* This function is only called inside conditionals which we
|
|
* rely on the compiler to optimize out when CONFIG_KVM is not
|
|
* defined.
|
|
*/
|
|
uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
|
|
uint32_t index, int reg)
|
|
{
|
|
abort();
|
|
}
|
|
#endif
|
|
|
|
bool kvm_hv_vpindex_settable(void)
|
|
{
|
|
return false;
|
|
}
|