|
@@ -2461,6 +2461,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
|
|
|
case KVM_CAP_TSC_DEADLINE_TIMER:
|
|
|
case KVM_CAP_ENABLE_CAP_VM:
|
|
|
case KVM_CAP_DISABLE_QUIRKS:
|
|
|
+ case KVM_CAP_SET_BOOT_CPU_ID:
|
|
|
#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
|
|
|
case KVM_CAP_ASSIGN_DEV_IRQ:
|
|
|
case KVM_CAP_PCI_2_3:
|
|
@@ -3777,6 +3778,15 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|
|
r = kvm_vm_ioctl_reinject(kvm, &control);
|
|
|
break;
|
|
|
}
|
|
|
+ case KVM_SET_BOOT_CPU_ID:
|
|
|
+ r = 0;
|
|
|
+ mutex_lock(&kvm->lock);
|
|
|
+ if (atomic_read(&kvm->online_vcpus) != 0)
|
|
|
+ r = -EBUSY;
|
|
|
+ else
|
|
|
+ kvm->arch.bsp_vcpu_id = arg;
|
|
|
+ mutex_unlock(&kvm->lock);
|
|
|
+ break;
|
|
|
case KVM_XEN_HVM_CONFIG: {
|
|
|
r = -EFAULT;
|
|
|
if (copy_from_user(&kvm->arch.xen_hvm_config, argp,
|
|
@@ -7291,6 +7301,17 @@ void kvm_arch_check_processor_compat(void *rtn)
|
|
|
kvm_x86_ops->check_processor_compatibility(rtn);
|
|
|
}
|
|
|
|
|
|
+bool kvm_vcpu_is_reset_bsp(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ return vcpu->kvm->arch.bsp_vcpu_id == vcpu->vcpu_id;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(kvm_vcpu_is_reset_bsp);
|
|
|
+
|
|
|
+bool kvm_vcpu_is_bsp(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ return (vcpu->arch.apic_base & MSR_IA32_APICBASE_BSP) != 0;
|
|
|
+}
|
|
|
+
|
|
|
bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
return irqchip_in_kernel(vcpu->kvm) == (vcpu->arch.apic != NULL);
|