|
@@ -3165,6 +3165,16 @@ out:
|
|
|
return r;
|
|
|
}
|
|
|
|
|
|
+int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event)
|
|
|
+{
|
|
|
+ if (!irqchip_in_kernel(kvm))
|
|
|
+ return -ENXIO;
|
|
|
+
|
|
|
+ irq_event->status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
|
|
|
+ irq_event->irq, irq_event->level);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
long kvm_arch_vm_ioctl(struct file *filp,
|
|
|
unsigned int ioctl, unsigned long arg)
|
|
|
{
|
|
@@ -3271,29 +3281,6 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|
|
create_pit_unlock:
|
|
|
mutex_unlock(&kvm->slots_lock);
|
|
|
break;
|
|
|
- case KVM_IRQ_LINE_STATUS:
|
|
|
- case KVM_IRQ_LINE: {
|
|
|
- struct kvm_irq_level irq_event;
|
|
|
-
|
|
|
- r = -EFAULT;
|
|
|
- if (copy_from_user(&irq_event, argp, sizeof irq_event))
|
|
|
- goto out;
|
|
|
- r = -ENXIO;
|
|
|
- if (irqchip_in_kernel(kvm)) {
|
|
|
- __s32 status;
|
|
|
- status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
|
|
|
- irq_event.irq, irq_event.level);
|
|
|
- if (ioctl == KVM_IRQ_LINE_STATUS) {
|
|
|
- r = -EFAULT;
|
|
|
- irq_event.status = status;
|
|
|
- if (copy_to_user(argp, &irq_event,
|
|
|
- sizeof irq_event))
|
|
|
- goto out;
|
|
|
- }
|
|
|
- r = 0;
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
case KVM_GET_IRQCHIP: {
|
|
|
/* 0: PIC master, 1: PIC slave, 2: IOAPIC */
|
|
|
struct kvm_irqchip *chip;
|