diff options
-rw-r--r-- | arch/ia64/kvm/kvm-ia64.c | 33 | ||||
-rw-r--r-- | arch/x86/kvm/x86.c | 33 | ||||
-rw-r--r-- | include/linux/kvm_host.h | 1 | ||||
-rw-r--r-- | virt/kvm/kvm_main.c | 23 |
4 files changed, 44 insertions, 46 deletions
diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c index bd77cb507c1c..eac65380bd20 100644 --- a/arch/ia64/kvm/kvm-ia64.c +++ b/arch/ia64/kvm/kvm-ia64.c | |||
@@ -924,6 +924,16 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs) | |||
924 | return 0; | 924 | return 0; |
925 | } | 925 | } |
926 | 926 | ||
927 | int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event) | ||
928 | { | ||
929 | if (!irqchip_in_kernel(kvm)) | ||
930 | return -ENXIO; | ||
931 | |||
932 | irq_event->status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, | ||
933 | irq_event->irq, irq_event->level); | ||
934 | return 0; | ||
935 | } | ||
936 | |||
927 | long kvm_arch_vm_ioctl(struct file *filp, | 937 | long kvm_arch_vm_ioctl(struct file *filp, |
928 | unsigned int ioctl, unsigned long arg) | 938 | unsigned int ioctl, unsigned long arg) |
929 | { | 939 | { |
@@ -963,29 +973,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
963 | goto out; | 973 | goto out; |
964 | } | 974 | } |
965 | break; | 975 | break; |
966 | case KVM_IRQ_LINE_STATUS: | ||
967 | case KVM_IRQ_LINE: { | ||
968 | struct kvm_irq_level irq_event; | ||
969 | |||
970 | r = -EFAULT; | ||
971 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) | ||
972 | goto out; | ||
973 | r = -ENXIO; | ||
974 | if (irqchip_in_kernel(kvm)) { | ||
975 | __s32 status; | ||
976 | status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, | ||
977 | irq_event.irq, irq_event.level); | ||
978 | if (ioctl == KVM_IRQ_LINE_STATUS) { | ||
979 | r = -EFAULT; | ||
980 | irq_event.status = status; | ||
981 | if (copy_to_user(argp, &irq_event, | ||
982 | sizeof irq_event)) | ||
983 | goto out; | ||
984 | } | ||
985 | r = 0; | ||
986 | } | ||
987 | break; | ||
988 | } | ||
989 | case KVM_GET_IRQCHIP: { | 976 | case KVM_GET_IRQCHIP: { |
990 | /* 0: PIC master, 1: PIC slave, 2: IOAPIC */ | 977 | /* 0: PIC master, 1: PIC slave, 2: IOAPIC */ |
991 | struct kvm_irqchip chip; | 978 | struct kvm_irqchip chip; |
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 3d9d08edbf29..b6379e55ee27 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
@@ -3165,6 +3165,16 @@ out: | |||
3165 | return r; | 3165 | return r; |
3166 | } | 3166 | } |
3167 | 3167 | ||
3168 | int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_event) | ||
3169 | { | ||
3170 | if (!irqchip_in_kernel(kvm)) | ||
3171 | return -ENXIO; | ||
3172 | |||
3173 | irq_event->status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, | ||
3174 | irq_event->irq, irq_event->level); | ||
3175 | return 0; | ||
3176 | } | ||
3177 | |||
3168 | long kvm_arch_vm_ioctl(struct file *filp, | 3178 | long kvm_arch_vm_ioctl(struct file *filp, |
3169 | unsigned int ioctl, unsigned long arg) | 3179 | unsigned int ioctl, unsigned long arg) |
3170 | { | 3180 | { |
@@ -3271,29 +3281,6 @@ long kvm_arch_vm_ioctl(struct file *filp, | |||
3271 | create_pit_unlock: | 3281 | create_pit_unlock: |
3272 | mutex_unlock(&kvm->slots_lock); | 3282 | mutex_unlock(&kvm->slots_lock); |
3273 | break; | 3283 | break; |
3274 | case KVM_IRQ_LINE_STATUS: | ||
3275 | case KVM_IRQ_LINE: { | ||
3276 | struct kvm_irq_level irq_event; | ||
3277 | |||
3278 | r = -EFAULT; | ||
3279 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) | ||
3280 | goto out; | ||
3281 | r = -ENXIO; | ||
3282 | if (irqchip_in_kernel(kvm)) { | ||
3283 | __s32 status; | ||
3284 | status = kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID, | ||
3285 | irq_event.irq, irq_event.level); | ||
3286 | if (ioctl == KVM_IRQ_LINE_STATUS) { | ||
3287 | r = -EFAULT; | ||
3288 | irq_event.status = status; | ||
3289 | if (copy_to_user(argp, &irq_event, | ||
3290 | sizeof irq_event)) | ||
3291 | goto out; | ||
3292 | } | ||
3293 | r = 0; | ||
3294 | } | ||
3295 | break; | ||
3296 | } | ||
3297 | case KVM_GET_IRQCHIP: { | 3284 | case KVM_GET_IRQCHIP: { |
3298 | /* 0: PIC master, 1: PIC slave, 2: IOAPIC */ | 3285 | /* 0: PIC master, 1: PIC slave, 2: IOAPIC */ |
3299 | struct kvm_irqchip *chip; | 3286 | struct kvm_irqchip *chip; |
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4e60d3695e4e..dbc65f9d6a2b 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h | |||
@@ -498,6 +498,7 @@ int kvm_vm_ioctl_set_memory_region(struct kvm *kvm, | |||
498 | struct | 498 | struct |
499 | kvm_userspace_memory_region *mem, | 499 | kvm_userspace_memory_region *mem, |
500 | int user_alloc); | 500 | int user_alloc); |
501 | int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level); | ||
501 | long kvm_arch_vm_ioctl(struct file *filp, | 502 | long kvm_arch_vm_ioctl(struct file *filp, |
502 | unsigned int ioctl, unsigned long arg); | 503 | unsigned int ioctl, unsigned long arg); |
503 | 504 | ||
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index de89497fe4c7..bcf973ec98ff 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
@@ -2149,6 +2149,29 @@ static long kvm_vm_ioctl(struct file *filp, | |||
2149 | break; | 2149 | break; |
2150 | } | 2150 | } |
2151 | #endif | 2151 | #endif |
2152 | #ifdef __KVM_HAVE_IRQ_LINE | ||
2153 | case KVM_IRQ_LINE_STATUS: | ||
2154 | case KVM_IRQ_LINE: { | ||
2155 | struct kvm_irq_level irq_event; | ||
2156 | |||
2157 | r = -EFAULT; | ||
2158 | if (copy_from_user(&irq_event, argp, sizeof irq_event)) | ||
2159 | goto out; | ||
2160 | |||
2161 | r = kvm_vm_ioctl_irq_line(kvm, &irq_event); | ||
2162 | if (r) | ||
2163 | goto out; | ||
2164 | |||
2165 | r = -EFAULT; | ||
2166 | if (ioctl == KVM_IRQ_LINE_STATUS) { | ||
2167 | if (copy_to_user(argp, &irq_event, sizeof irq_event)) | ||
2168 | goto out; | ||
2169 | } | ||
2170 | |||
2171 | r = 0; | ||
2172 | break; | ||
2173 | } | ||
2174 | #endif | ||
2152 | default: | 2175 | default: |
2153 | r = kvm_arch_vm_ioctl(filp, ioctl, arg); | 2176 | r = kvm_arch_vm_ioctl(filp, ioctl, arg); |
2154 | if (r == -ENOTTY) | 2177 | if (r == -ENOTTY) |