xref: /openbmc/linux/arch/s390/kvm/interrupt.c (revision 78c99ba1)
1 /*
2  * interrupt.c - handling kvm guest interrupts
3  *
4  * Copyright IBM Corp. 2008
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License (version 2 only)
8  * as published by the Free Software Foundation.
9  *
10  *    Author(s): Carsten Otte <cotte@de.ibm.com>
11  */
12 
13 #include <asm/lowcore.h>
14 #include <asm/uaccess.h>
15 #include <linux/hrtimer.h>
16 #include <linux/interrupt.h>
17 #include <linux/kvm_host.h>
18 #include <linux/signal.h>
19 #include "kvm-s390.h"
20 #include "gaccess.h"
21 
22 static int psw_extint_disabled(struct kvm_vcpu *vcpu)
23 {
24 	return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT);
25 }
26 
27 static int psw_interrupts_disabled(struct kvm_vcpu *vcpu)
28 {
29 	if ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PER) ||
30 	    (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_IO) ||
31 	    (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT))
32 		return 0;
33 	return 1;
34 }
35 
36 static int __interrupt_is_deliverable(struct kvm_vcpu *vcpu,
37 				      struct kvm_s390_interrupt_info *inti)
38 {
39 	switch (inti->type) {
40 	case KVM_S390_INT_EMERGENCY:
41 		if (psw_extint_disabled(vcpu))
42 			return 0;
43 		if (vcpu->arch.sie_block->gcr[0] & 0x4000ul)
44 			return 1;
45 		return 0;
46 	case KVM_S390_INT_SERVICE:
47 		if (psw_extint_disabled(vcpu))
48 			return 0;
49 		if (vcpu->arch.sie_block->gcr[0] & 0x200ul)
50 			return 1;
51 		return 0;
52 	case KVM_S390_INT_VIRTIO:
53 		if (psw_extint_disabled(vcpu))
54 			return 0;
55 		if (vcpu->arch.sie_block->gcr[0] & 0x200ul)
56 			return 1;
57 		return 0;
58 	case KVM_S390_PROGRAM_INT:
59 	case KVM_S390_SIGP_STOP:
60 	case KVM_S390_SIGP_SET_PREFIX:
61 	case KVM_S390_RESTART:
62 		return 1;
63 	default:
64 		BUG();
65 	}
66 	return 0;
67 }
68 
69 static void __set_cpu_idle(struct kvm_vcpu *vcpu)
70 {
71 	BUG_ON(vcpu->vcpu_id > KVM_MAX_VCPUS - 1);
72 	atomic_set_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags);
73 	set_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask);
74 }
75 
76 static void __unset_cpu_idle(struct kvm_vcpu *vcpu)
77 {
78 	BUG_ON(vcpu->vcpu_id > KVM_MAX_VCPUS - 1);
79 	atomic_clear_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags);
80 	clear_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask);
81 }
82 
83 static void __reset_intercept_indicators(struct kvm_vcpu *vcpu)
84 {
85 	atomic_clear_mask(CPUSTAT_ECALL_PEND |
86 		CPUSTAT_IO_INT | CPUSTAT_EXT_INT | CPUSTAT_STOP_INT,
87 		&vcpu->arch.sie_block->cpuflags);
88 	vcpu->arch.sie_block->lctl = 0x0000;
89 }
90 
91 static void __set_cpuflag(struct kvm_vcpu *vcpu, u32 flag)
92 {
93 	atomic_set_mask(flag, &vcpu->arch.sie_block->cpuflags);
94 }
95 
96 static void __set_intercept_indicator(struct kvm_vcpu *vcpu,
97 				      struct kvm_s390_interrupt_info *inti)
98 {
99 	switch (inti->type) {
100 	case KVM_S390_INT_EMERGENCY:
101 	case KVM_S390_INT_SERVICE:
102 	case KVM_S390_INT_VIRTIO:
103 		if (psw_extint_disabled(vcpu))
104 			__set_cpuflag(vcpu, CPUSTAT_EXT_INT);
105 		else
106 			vcpu->arch.sie_block->lctl |= LCTL_CR0;
107 		break;
108 	case KVM_S390_SIGP_STOP:
109 		__set_cpuflag(vcpu, CPUSTAT_STOP_INT);
110 		break;
111 	default:
112 		BUG();
113 	}
114 }
115 
116 static void __do_deliver_interrupt(struct kvm_vcpu *vcpu,
117 				   struct kvm_s390_interrupt_info *inti)
118 {
119 	const unsigned short table[] = { 2, 4, 4, 6 };
120 	int rc, exception = 0;
121 
122 	switch (inti->type) {
123 	case KVM_S390_INT_EMERGENCY:
124 		VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp emerg");
125 		vcpu->stat.deliver_emergency_signal++;
126 		rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x1201);
127 		if (rc == -EFAULT)
128 			exception = 1;
129 
130 		rc = copy_to_guest(vcpu, __LC_EXT_OLD_PSW,
131 			 &vcpu->arch.sie_block->gpsw, sizeof(psw_t));
132 		if (rc == -EFAULT)
133 			exception = 1;
134 
135 		rc = copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw,
136 			__LC_EXT_NEW_PSW, sizeof(psw_t));
137 		if (rc == -EFAULT)
138 			exception = 1;
139 		break;
140 
141 	case KVM_S390_INT_SERVICE:
142 		VCPU_EVENT(vcpu, 4, "interrupt: sclp parm:%x",
143 			   inti->ext.ext_params);
144 		vcpu->stat.deliver_service_signal++;
145 		rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2401);
146 		if (rc == -EFAULT)
147 			exception = 1;
148 
149 		rc = copy_to_guest(vcpu, __LC_EXT_OLD_PSW,
150 			 &vcpu->arch.sie_block->gpsw, sizeof(psw_t));
151 		if (rc == -EFAULT)
152 			exception = 1;
153 
154 		rc = copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw,
155 			__LC_EXT_NEW_PSW, sizeof(psw_t));
156 		if (rc == -EFAULT)
157 			exception = 1;
158 
159 		rc = put_guest_u32(vcpu, __LC_EXT_PARAMS, inti->ext.ext_params);
160 		if (rc == -EFAULT)
161 			exception = 1;
162 		break;
163 
164 	case KVM_S390_INT_VIRTIO:
165 		VCPU_EVENT(vcpu, 4, "interrupt: virtio parm:%x,parm64:%llx",
166 			   inti->ext.ext_params, inti->ext.ext_params2);
167 		vcpu->stat.deliver_virtio_interrupt++;
168 		rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x2603);
169 		if (rc == -EFAULT)
170 			exception = 1;
171 
172 		rc = put_guest_u16(vcpu, __LC_CPU_ADDRESS, 0x0d00);
173 		if (rc == -EFAULT)
174 			exception = 1;
175 
176 		rc = copy_to_guest(vcpu, __LC_EXT_OLD_PSW,
177 			 &vcpu->arch.sie_block->gpsw, sizeof(psw_t));
178 		if (rc == -EFAULT)
179 			exception = 1;
180 
181 		rc = copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw,
182 			__LC_EXT_NEW_PSW, sizeof(psw_t));
183 		if (rc == -EFAULT)
184 			exception = 1;
185 
186 		rc = put_guest_u32(vcpu, __LC_EXT_PARAMS, inti->ext.ext_params);
187 		if (rc == -EFAULT)
188 			exception = 1;
189 
190 		rc = put_guest_u64(vcpu, __LC_PFAULT_INTPARM,
191 			inti->ext.ext_params2);
192 		if (rc == -EFAULT)
193 			exception = 1;
194 		break;
195 
196 	case KVM_S390_SIGP_STOP:
197 		VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu stop");
198 		vcpu->stat.deliver_stop_signal++;
199 		__set_intercept_indicator(vcpu, inti);
200 		break;
201 
202 	case KVM_S390_SIGP_SET_PREFIX:
203 		VCPU_EVENT(vcpu, 4, "interrupt: set prefix to %x",
204 			   inti->prefix.address);
205 		vcpu->stat.deliver_prefix_signal++;
206 		vcpu->arch.sie_block->prefix = inti->prefix.address;
207 		vcpu->arch.sie_block->ihcpu = 0xffff;
208 		break;
209 
210 	case KVM_S390_RESTART:
211 		VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu restart");
212 		vcpu->stat.deliver_restart_signal++;
213 		rc = copy_to_guest(vcpu, offsetof(struct _lowcore,
214 		  restart_old_psw), &vcpu->arch.sie_block->gpsw, sizeof(psw_t));
215 		if (rc == -EFAULT)
216 			exception = 1;
217 
218 		rc = copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw,
219 			offsetof(struct _lowcore, restart_psw), sizeof(psw_t));
220 		if (rc == -EFAULT)
221 			exception = 1;
222 		break;
223 
224 	case KVM_S390_PROGRAM_INT:
225 		VCPU_EVENT(vcpu, 4, "interrupt: pgm check code:%x, ilc:%x",
226 			   inti->pgm.code,
227 			   table[vcpu->arch.sie_block->ipa >> 14]);
228 		vcpu->stat.deliver_program_int++;
229 		rc = put_guest_u16(vcpu, __LC_PGM_INT_CODE, inti->pgm.code);
230 		if (rc == -EFAULT)
231 			exception = 1;
232 
233 		rc = put_guest_u16(vcpu, __LC_PGM_ILC,
234 			table[vcpu->arch.sie_block->ipa >> 14]);
235 		if (rc == -EFAULT)
236 			exception = 1;
237 
238 		rc = copy_to_guest(vcpu, __LC_PGM_OLD_PSW,
239 			 &vcpu->arch.sie_block->gpsw, sizeof(psw_t));
240 		if (rc == -EFAULT)
241 			exception = 1;
242 
243 		rc = copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw,
244 			__LC_PGM_NEW_PSW, sizeof(psw_t));
245 		if (rc == -EFAULT)
246 			exception = 1;
247 		break;
248 
249 	default:
250 		BUG();
251 	}
252 	if (exception) {
253 		printk("kvm: The guest lowcore is not mapped during interrupt "
254 			"delivery, killing userspace\n");
255 		do_exit(SIGKILL);
256 	}
257 }
258 
259 static int __try_deliver_ckc_interrupt(struct kvm_vcpu *vcpu)
260 {
261 	int rc, exception = 0;
262 
263 	if (psw_extint_disabled(vcpu))
264 		return 0;
265 	if (!(vcpu->arch.sie_block->gcr[0] & 0x800ul))
266 		return 0;
267 	rc = put_guest_u16(vcpu, __LC_EXT_INT_CODE, 0x1004);
268 	if (rc == -EFAULT)
269 		exception = 1;
270 	rc = copy_to_guest(vcpu, __LC_EXT_OLD_PSW,
271 		 &vcpu->arch.sie_block->gpsw, sizeof(psw_t));
272 	if (rc == -EFAULT)
273 		exception = 1;
274 	rc = copy_from_guest(vcpu, &vcpu->arch.sie_block->gpsw,
275 		__LC_EXT_NEW_PSW, sizeof(psw_t));
276 	if (rc == -EFAULT)
277 		exception = 1;
278 	if (exception) {
279 		printk("kvm: The guest lowcore is not mapped during interrupt "
280 			"delivery, killing userspace\n");
281 		do_exit(SIGKILL);
282 	}
283 	return 1;
284 }
285 
286 int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu)
287 {
288 	struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
289 	struct kvm_s390_float_interrupt *fi = vcpu->arch.local_int.float_int;
290 	struct kvm_s390_interrupt_info  *inti;
291 	int rc = 0;
292 
293 	if (atomic_read(&li->active)) {
294 		spin_lock_bh(&li->lock);
295 		list_for_each_entry(inti, &li->list, list)
296 			if (__interrupt_is_deliverable(vcpu, inti)) {
297 				rc = 1;
298 				break;
299 			}
300 		spin_unlock_bh(&li->lock);
301 	}
302 
303 	if ((!rc) && atomic_read(&fi->active)) {
304 		spin_lock(&fi->lock);
305 		list_for_each_entry(inti, &fi->list, list)
306 			if (__interrupt_is_deliverable(vcpu, inti)) {
307 				rc = 1;
308 				break;
309 			}
310 		spin_unlock(&fi->lock);
311 	}
312 
313 	if ((!rc) && (vcpu->arch.sie_block->ckc <
314 		get_clock() + vcpu->arch.sie_block->epoch)) {
315 		if ((!psw_extint_disabled(vcpu)) &&
316 			(vcpu->arch.sie_block->gcr[0] & 0x800ul))
317 			rc = 1;
318 	}
319 
320 	return rc;
321 }
322 
323 int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu)
324 {
325 	/* do real check here */
326 	return 1;
327 }
328 
329 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
330 {
331 	return 0;
332 }
333 
334 int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)
335 {
336 	u64 now, sltime;
337 	DECLARE_WAITQUEUE(wait, current);
338 
339 	vcpu->stat.exit_wait_state++;
340 	if (kvm_cpu_has_interrupt(vcpu))
341 		return 0;
342 
343 	__set_cpu_idle(vcpu);
344 	spin_lock_bh(&vcpu->arch.local_int.lock);
345 	vcpu->arch.local_int.timer_due = 0;
346 	spin_unlock_bh(&vcpu->arch.local_int.lock);
347 
348 	if (psw_interrupts_disabled(vcpu)) {
349 		VCPU_EVENT(vcpu, 3, "%s", "disabled wait");
350 		__unset_cpu_idle(vcpu);
351 		return -ENOTSUPP; /* disabled wait */
352 	}
353 
354 	if (psw_extint_disabled(vcpu) ||
355 	    (!(vcpu->arch.sie_block->gcr[0] & 0x800ul))) {
356 		VCPU_EVENT(vcpu, 3, "%s", "enabled wait w/o timer");
357 		goto no_timer;
358 	}
359 
360 	now = get_clock() + vcpu->arch.sie_block->epoch;
361 	if (vcpu->arch.sie_block->ckc < now) {
362 		__unset_cpu_idle(vcpu);
363 		return 0;
364 	}
365 
366 	sltime = ((vcpu->arch.sie_block->ckc - now)*125)>>9;
367 
368 	hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL);
369 	VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime);
370 no_timer:
371 	spin_lock(&vcpu->arch.local_int.float_int->lock);
372 	spin_lock_bh(&vcpu->arch.local_int.lock);
373 	add_wait_queue(&vcpu->arch.local_int.wq, &wait);
374 	while (list_empty(&vcpu->arch.local_int.list) &&
375 		list_empty(&vcpu->arch.local_int.float_int->list) &&
376 		(!vcpu->arch.local_int.timer_due) &&
377 		!signal_pending(current)) {
378 		set_current_state(TASK_INTERRUPTIBLE);
379 		spin_unlock_bh(&vcpu->arch.local_int.lock);
380 		spin_unlock(&vcpu->arch.local_int.float_int->lock);
381 		vcpu_put(vcpu);
382 		schedule();
383 		vcpu_load(vcpu);
384 		spin_lock(&vcpu->arch.local_int.float_int->lock);
385 		spin_lock_bh(&vcpu->arch.local_int.lock);
386 	}
387 	__unset_cpu_idle(vcpu);
388 	__set_current_state(TASK_RUNNING);
389 	remove_wait_queue(&vcpu->wq, &wait);
390 	spin_unlock_bh(&vcpu->arch.local_int.lock);
391 	spin_unlock(&vcpu->arch.local_int.float_int->lock);
392 	hrtimer_try_to_cancel(&vcpu->arch.ckc_timer);
393 	return 0;
394 }
395 
396 void kvm_s390_tasklet(unsigned long parm)
397 {
398 	struct kvm_vcpu *vcpu = (struct kvm_vcpu *) parm;
399 
400 	spin_lock(&vcpu->arch.local_int.lock);
401 	vcpu->arch.local_int.timer_due = 1;
402 	if (waitqueue_active(&vcpu->arch.local_int.wq))
403 		wake_up_interruptible(&vcpu->arch.local_int.wq);
404 	spin_unlock(&vcpu->arch.local_int.lock);
405 }
406 
407 /*
408  * low level hrtimer wake routine. Because this runs in hardirq context
409  * we schedule a tasklet to do the real work.
410  */
411 enum hrtimer_restart kvm_s390_idle_wakeup(struct hrtimer *timer)
412 {
413 	struct kvm_vcpu *vcpu;
414 
415 	vcpu = container_of(timer, struct kvm_vcpu, arch.ckc_timer);
416 	tasklet_schedule(&vcpu->arch.tasklet);
417 
418 	return HRTIMER_NORESTART;
419 }
420 
421 void kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu)
422 {
423 	struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
424 	struct kvm_s390_float_interrupt *fi = vcpu->arch.local_int.float_int;
425 	struct kvm_s390_interrupt_info  *n, *inti = NULL;
426 	int deliver;
427 
428 	__reset_intercept_indicators(vcpu);
429 	if (atomic_read(&li->active)) {
430 		do {
431 			deliver = 0;
432 			spin_lock_bh(&li->lock);
433 			list_for_each_entry_safe(inti, n, &li->list, list) {
434 				if (__interrupt_is_deliverable(vcpu, inti)) {
435 					list_del(&inti->list);
436 					deliver = 1;
437 					break;
438 				}
439 				__set_intercept_indicator(vcpu, inti);
440 			}
441 			if (list_empty(&li->list))
442 				atomic_set(&li->active, 0);
443 			spin_unlock_bh(&li->lock);
444 			if (deliver) {
445 				__do_deliver_interrupt(vcpu, inti);
446 				kfree(inti);
447 			}
448 		} while (deliver);
449 	}
450 
451 	if ((vcpu->arch.sie_block->ckc <
452 		get_clock() + vcpu->arch.sie_block->epoch))
453 		__try_deliver_ckc_interrupt(vcpu);
454 
455 	if (atomic_read(&fi->active)) {
456 		do {
457 			deliver = 0;
458 			spin_lock(&fi->lock);
459 			list_for_each_entry_safe(inti, n, &fi->list, list) {
460 				if (__interrupt_is_deliverable(vcpu, inti)) {
461 					list_del(&inti->list);
462 					deliver = 1;
463 					break;
464 				}
465 				__set_intercept_indicator(vcpu, inti);
466 			}
467 			if (list_empty(&fi->list))
468 				atomic_set(&fi->active, 0);
469 			spin_unlock(&fi->lock);
470 			if (deliver) {
471 				__do_deliver_interrupt(vcpu, inti);
472 				kfree(inti);
473 			}
474 		} while (deliver);
475 	}
476 }
477 
478 int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code)
479 {
480 	struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int;
481 	struct kvm_s390_interrupt_info *inti;
482 
483 	inti = kzalloc(sizeof(*inti), GFP_KERNEL);
484 	if (!inti)
485 		return -ENOMEM;
486 
487 	inti->type = KVM_S390_PROGRAM_INT;;
488 	inti->pgm.code = code;
489 
490 	VCPU_EVENT(vcpu, 3, "inject: program check %d (from kernel)", code);
491 	spin_lock_bh(&li->lock);
492 	list_add(&inti->list, &li->list);
493 	atomic_set(&li->active, 1);
494 	BUG_ON(waitqueue_active(&li->wq));
495 	spin_unlock_bh(&li->lock);
496 	return 0;
497 }
498 
499 int kvm_s390_inject_vm(struct kvm *kvm,
500 		       struct kvm_s390_interrupt *s390int)
501 {
502 	struct kvm_s390_local_interrupt *li;
503 	struct kvm_s390_float_interrupt *fi;
504 	struct kvm_s390_interrupt_info *inti;
505 	int sigcpu;
506 
507 	inti = kzalloc(sizeof(*inti), GFP_KERNEL);
508 	if (!inti)
509 		return -ENOMEM;
510 
511 	switch (s390int->type) {
512 	case KVM_S390_INT_VIRTIO:
513 		VM_EVENT(kvm, 5, "inject: virtio parm:%x,parm64:%llx",
514 			 s390int->parm, s390int->parm64);
515 		inti->type = s390int->type;
516 		inti->ext.ext_params = s390int->parm;
517 		inti->ext.ext_params2 = s390int->parm64;
518 		break;
519 	case KVM_S390_INT_SERVICE:
520 		VM_EVENT(kvm, 5, "inject: sclp parm:%x", s390int->parm);
521 		inti->type = s390int->type;
522 		inti->ext.ext_params = s390int->parm;
523 		break;
524 	case KVM_S390_PROGRAM_INT:
525 	case KVM_S390_SIGP_STOP:
526 	case KVM_S390_INT_EMERGENCY:
527 	default:
528 		kfree(inti);
529 		return -EINVAL;
530 	}
531 
532 	mutex_lock(&kvm->lock);
533 	fi = &kvm->arch.float_int;
534 	spin_lock(&fi->lock);
535 	list_add_tail(&inti->list, &fi->list);
536 	atomic_set(&fi->active, 1);
537 	sigcpu = find_first_bit(fi->idle_mask, KVM_MAX_VCPUS);
538 	if (sigcpu == KVM_MAX_VCPUS) {
539 		do {
540 			sigcpu = fi->next_rr_cpu++;
541 			if (sigcpu == KVM_MAX_VCPUS)
542 				sigcpu = fi->next_rr_cpu = 0;
543 		} while (fi->local_int[sigcpu] == NULL);
544 	}
545 	li = fi->local_int[sigcpu];
546 	spin_lock_bh(&li->lock);
547 	atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags);
548 	if (waitqueue_active(&li->wq))
549 		wake_up_interruptible(&li->wq);
550 	spin_unlock_bh(&li->lock);
551 	spin_unlock(&fi->lock);
552 	mutex_unlock(&kvm->lock);
553 	return 0;
554 }
555 
556 int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu,
557 			 struct kvm_s390_interrupt *s390int)
558 {
559 	struct kvm_s390_local_interrupt *li;
560 	struct kvm_s390_interrupt_info *inti;
561 
562 	inti = kzalloc(sizeof(*inti), GFP_KERNEL);
563 	if (!inti)
564 		return -ENOMEM;
565 
566 	switch (s390int->type) {
567 	case KVM_S390_PROGRAM_INT:
568 		if (s390int->parm & 0xffff0000) {
569 			kfree(inti);
570 			return -EINVAL;
571 		}
572 		inti->type = s390int->type;
573 		inti->pgm.code = s390int->parm;
574 		VCPU_EVENT(vcpu, 3, "inject: program check %d (from user)",
575 			   s390int->parm);
576 		break;
577 	case KVM_S390_SIGP_SET_PREFIX:
578 		inti->prefix.address = s390int->parm;
579 		inti->type = s390int->type;
580 		VCPU_EVENT(vcpu, 3, "inject: set prefix to %x (from user)",
581 			   s390int->parm);
582 		break;
583 	case KVM_S390_SIGP_STOP:
584 	case KVM_S390_RESTART:
585 	case KVM_S390_INT_EMERGENCY:
586 		VCPU_EVENT(vcpu, 3, "inject: type %x", s390int->type);
587 		inti->type = s390int->type;
588 		break;
589 	case KVM_S390_INT_VIRTIO:
590 	case KVM_S390_INT_SERVICE:
591 	default:
592 		kfree(inti);
593 		return -EINVAL;
594 	}
595 
596 	mutex_lock(&vcpu->kvm->lock);
597 	li = &vcpu->arch.local_int;
598 	spin_lock_bh(&li->lock);
599 	if (inti->type == KVM_S390_PROGRAM_INT)
600 		list_add(&inti->list, &li->list);
601 	else
602 		list_add_tail(&inti->list, &li->list);
603 	atomic_set(&li->active, 1);
604 	if (inti->type == KVM_S390_SIGP_STOP)
605 		li->action_bits |= ACTION_STOP_ON_STOP;
606 	atomic_set_mask(CPUSTAT_EXT_INT, li->cpuflags);
607 	if (waitqueue_active(&li->wq))
608 		wake_up_interruptible(&vcpu->arch.local_int.wq);
609 	spin_unlock_bh(&li->lock);
610 	mutex_unlock(&vcpu->kvm->lock);
611 	return 0;
612 }
613