mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 13:37:36 +02:00
KVM: x86: Move KVM_{GET,SET}_IRQCHIP ioctl helpers to irq.c
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>
This commit is contained in:
parent
00b5ebf8db
commit
b771b1616f
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user