]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Move KVM_{GET,SET}_IRQCHIP ioctl helpers to irq.c
authorSean Christopherson <seanjc@google.com>
Wed, 11 Jun 2025 21:35:45 +0000 (14:35 -0700)
committerSean Christopherson <seanjc@google.com>
Fri, 20 Jun 2025 20:52:45 +0000 (13:52 -0700)
Move the ioctl helpers for getting/setting fully in-kernel IRQ chip state
to irq.c, partly to trim down x86.c, but mostly in preparation for adding
a Kconfig to control support for in-kernel I/O APIC, PIC, and PIT
emulation.

No functional change intended.

Acked-by: Kai Huang <kai.huang@intel.com>
Link: https://lore.kernel.org/r/20250611213557.294358-7-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/irq.c
arch/x86/kvm/irq.h
arch/x86/kvm/x86.c

index 97d68d8379293b05715d67b6b1cf329127fa7ec3..da47e2165389bc2571c267521a9ff442c1e507b0 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/export.h>
 #include <linux/kvm_host.h>
 
+#include "ioapic.h"
 #include "irq.h"
 #include "i8254.h"
 #include "x86.h"
@@ -178,3 +179,58 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm)
 {
        return irqchip_in_kernel(kvm);
 }
+
+int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+       struct kvm_pic *pic = kvm->arch.vpic;
+       int r;
+
+       r = 0;
+       switch (chip->chip_id) {
+       case KVM_IRQCHIP_PIC_MASTER:
+               memcpy(&chip->chip.pic, &pic->pics[0],
+                       sizeof(struct kvm_pic_state));
+               break;
+       case KVM_IRQCHIP_PIC_SLAVE:
+               memcpy(&chip->chip.pic, &pic->pics[1],
+                       sizeof(struct kvm_pic_state));
+               break;
+       case KVM_IRQCHIP_IOAPIC:
+               kvm_get_ioapic(kvm, &chip->chip.ioapic);
+               break;
+       default:
+               r = -EINVAL;
+               break;
+       }
+       return r;
+}
+
+int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
+{
+       struct kvm_pic *pic = kvm->arch.vpic;
+       int r;
+
+       r = 0;
+       switch (chip->chip_id) {
+       case KVM_IRQCHIP_PIC_MASTER:
+               spin_lock(&pic->lock);
+               memcpy(&pic->pics[0], &chip->chip.pic,
+                       sizeof(struct kvm_pic_state));
+               spin_unlock(&pic->lock);
+               break;
+       case KVM_IRQCHIP_PIC_SLAVE:
+               spin_lock(&pic->lock);
+               memcpy(&pic->pics[1], &chip->chip.pic,
+                       sizeof(struct kvm_pic_state));
+               spin_unlock(&pic->lock);
+               break;
+       case KVM_IRQCHIP_IOAPIC:
+               kvm_set_ioapic(kvm, &chip->chip.ioapic);
+               break;
+       default:
+               r = -EINVAL;
+               break;
+       }
+       kvm_pic_update_irq(pic);
+       return r;
+}
index 33dd5666b65681b0eb6733c2e43000919c196cb3..aa77a6b2828c1490c9f8a862f539203ca53b6df2 100644 (file)
@@ -66,6 +66,9 @@ void kvm_pic_update_irq(struct kvm_pic *s);
 int kvm_pic_set_irq(struct kvm_kernel_irq_routing_entry *e, struct kvm *kvm,
                    int irq_source_id, int level, bool line_status);
 
+int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip);
+int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip);
+
 static inline int irqchip_split(struct kvm *kvm)
 {
        int mode = kvm->arch.irqchip_mode;
index 0ee1f7d311e58ea15710e63a1a639df96df8da30..787fc22dab542093ff17325d2b1b6c54b30d9677 100644 (file)
@@ -6395,61 +6395,6 @@ static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
        return 0;
 }
 
-static int kvm_vm_ioctl_get_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
-       struct kvm_pic *pic = kvm->arch.vpic;
-       int r;
-
-       r = 0;
-       switch (chip->chip_id) {
-       case KVM_IRQCHIP_PIC_MASTER:
-               memcpy(&chip->chip.pic, &pic->pics[0],
-                       sizeof(struct kvm_pic_state));
-               break;
-       case KVM_IRQCHIP_PIC_SLAVE:
-               memcpy(&chip->chip.pic, &pic->pics[1],
-                       sizeof(struct kvm_pic_state));
-               break;
-       case KVM_IRQCHIP_IOAPIC:
-               kvm_get_ioapic(kvm, &chip->chip.ioapic);
-               break;
-       default:
-               r = -EINVAL;
-               break;
-       }
-       return r;
-}
-
-static int kvm_vm_ioctl_set_irqchip(struct kvm *kvm, struct kvm_irqchip *chip)
-{
-       struct kvm_pic *pic = kvm->arch.vpic;
-       int r;
-
-       r = 0;
-       switch (chip->chip_id) {
-       case KVM_IRQCHIP_PIC_MASTER:
-               spin_lock(&pic->lock);
-               memcpy(&pic->pics[0], &chip->chip.pic,
-                       sizeof(struct kvm_pic_state));
-               spin_unlock(&pic->lock);
-               break;
-       case KVM_IRQCHIP_PIC_SLAVE:
-               spin_lock(&pic->lock);
-               memcpy(&pic->pics[1], &chip->chip.pic,
-                       sizeof(struct kvm_pic_state));
-               spin_unlock(&pic->lock);
-               break;
-       case KVM_IRQCHIP_IOAPIC:
-               kvm_set_ioapic(kvm, &chip->chip.ioapic);
-               break;
-       default:
-               r = -EINVAL;
-               break;
-       }
-       kvm_pic_update_irq(pic);
-       return r;
-}
-
 void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *memslot)
 {