aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/ia64/kvm/kvm-ia64.c33
-rw-r--r--arch/x86/kvm/x86.c33
-rw-r--r--include/linux/kvm_host.h1
-rw-r--r--virt/kvm/kvm_main.c23
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
927int 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
927long kvm_arch_vm_ioctl(struct file *filp, 937long 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
3168int 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
3168long kvm_arch_vm_ioctl(struct file *filp, 3178long 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);
501int kvm_vm_ioctl_irq_line(struct kvm *kvm, struct kvm_irq_level *irq_level);
501long kvm_arch_vm_ioctl(struct file *filp, 502long 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)