Lines Matching refs:vcpu
38 int psw_extint_disabled(struct kvm_vcpu *vcpu) in psw_extint_disabled() argument
40 return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT); in psw_extint_disabled()
43 static int psw_ioint_disabled(struct kvm_vcpu *vcpu) in psw_ioint_disabled() argument
45 return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_IO); in psw_ioint_disabled()
48 static int psw_mchk_disabled(struct kvm_vcpu *vcpu) in psw_mchk_disabled() argument
50 return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_MCHECK); in psw_mchk_disabled()
53 static int psw_interrupts_disabled(struct kvm_vcpu *vcpu) in psw_interrupts_disabled() argument
55 if ((vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PER) || in psw_interrupts_disabled()
56 (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_IO) || in psw_interrupts_disabled()
57 (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT)) in psw_interrupts_disabled()
62 static int ckc_interrupts_enabled(struct kvm_vcpu *vcpu) in ckc_interrupts_enabled() argument
64 if (psw_extint_disabled(vcpu) || in ckc_interrupts_enabled()
65 !(vcpu->arch.sie_block->gcr[0] & 0x800ul)) in ckc_interrupts_enabled()
67 if (guestdbg_enabled(vcpu) && guestdbg_sstep_enabled(vcpu)) in ckc_interrupts_enabled()
73 static int ckc_irq_pending(struct kvm_vcpu *vcpu) in ckc_irq_pending() argument
75 if (!(vcpu->arch.sie_block->ckc < in ckc_irq_pending()
76 get_tod_clock_fast() + vcpu->arch.sie_block->epoch)) in ckc_irq_pending()
78 return ckc_interrupts_enabled(vcpu); in ckc_irq_pending()
81 static int cpu_timer_interrupts_enabled(struct kvm_vcpu *vcpu) in cpu_timer_interrupts_enabled() argument
83 return !psw_extint_disabled(vcpu) && in cpu_timer_interrupts_enabled()
84 (vcpu->arch.sie_block->gcr[0] & 0x400ul); in cpu_timer_interrupts_enabled()
87 static int cpu_timer_irq_pending(struct kvm_vcpu *vcpu) in cpu_timer_irq_pending() argument
89 return (vcpu->arch.sie_block->cputm >> 63) && in cpu_timer_irq_pending()
90 cpu_timer_interrupts_enabled(vcpu); in cpu_timer_irq_pending()
109 static inline unsigned long pending_floating_irqs(struct kvm_vcpu *vcpu) in pending_floating_irqs() argument
111 return vcpu->kvm->arch.float_int.pending_irqs; in pending_floating_irqs()
114 static inline unsigned long pending_local_irqs(struct kvm_vcpu *vcpu) in pending_local_irqs() argument
116 return vcpu->arch.local_int.pending_irqs; in pending_local_irqs()
119 static unsigned long disable_iscs(struct kvm_vcpu *vcpu, in disable_iscs() argument
125 if (!(vcpu->arch.sie_block->gcr[6] & isc_to_isc_bits(i))) in disable_iscs()
131 static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu) in deliverable_irqs() argument
135 active_mask = pending_local_irqs(vcpu); in deliverable_irqs()
136 active_mask |= pending_floating_irqs(vcpu); in deliverable_irqs()
138 if (psw_extint_disabled(vcpu)) in deliverable_irqs()
140 if (psw_ioint_disabled(vcpu)) in deliverable_irqs()
143 active_mask = disable_iscs(vcpu, active_mask); in deliverable_irqs()
144 if (!(vcpu->arch.sie_block->gcr[0] & 0x2000ul)) in deliverable_irqs()
146 if (!(vcpu->arch.sie_block->gcr[0] & 0x4000ul)) in deliverable_irqs()
148 if (!(vcpu->arch.sie_block->gcr[0] & 0x800ul)) in deliverable_irqs()
150 if (!(vcpu->arch.sie_block->gcr[0] & 0x400ul)) in deliverable_irqs()
152 if (!(vcpu->arch.sie_block->gcr[0] & 0x200ul)) in deliverable_irqs()
154 if (psw_mchk_disabled(vcpu)) in deliverable_irqs()
156 if (!(vcpu->arch.sie_block->gcr[14] & in deliverable_irqs()
157 vcpu->kvm->arch.float_int.mchk.cr14)) in deliverable_irqs()
169 static void __set_cpu_idle(struct kvm_vcpu *vcpu) in __set_cpu_idle() argument
171 atomic_set_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); in __set_cpu_idle()
172 set_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); in __set_cpu_idle()
175 static void __unset_cpu_idle(struct kvm_vcpu *vcpu) in __unset_cpu_idle() argument
177 atomic_clear_mask(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); in __unset_cpu_idle()
178 clear_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); in __unset_cpu_idle()
181 static void __reset_intercept_indicators(struct kvm_vcpu *vcpu) in __reset_intercept_indicators() argument
184 &vcpu->arch.sie_block->cpuflags); in __reset_intercept_indicators()
185 vcpu->arch.sie_block->lctl = 0x0000; in __reset_intercept_indicators()
186 vcpu->arch.sie_block->ictl &= ~(ICTL_LPSW | ICTL_STCTL | ICTL_PINT); in __reset_intercept_indicators()
188 if (guestdbg_enabled(vcpu)) { in __reset_intercept_indicators()
189 vcpu->arch.sie_block->lctl |= (LCTL_CR0 | LCTL_CR9 | in __reset_intercept_indicators()
191 vcpu->arch.sie_block->ictl |= (ICTL_STCTL | ICTL_PINT); in __reset_intercept_indicators()
195 static void __set_cpuflag(struct kvm_vcpu *vcpu, u32 flag) in __set_cpuflag() argument
197 atomic_set_mask(flag, &vcpu->arch.sie_block->cpuflags); in __set_cpuflag()
200 static void set_intercept_indicators_io(struct kvm_vcpu *vcpu) in set_intercept_indicators_io() argument
202 if (!(pending_floating_irqs(vcpu) & IRQ_PEND_IO_MASK)) in set_intercept_indicators_io()
204 else if (psw_ioint_disabled(vcpu)) in set_intercept_indicators_io()
205 __set_cpuflag(vcpu, CPUSTAT_IO_INT); in set_intercept_indicators_io()
207 vcpu->arch.sie_block->lctl |= LCTL_CR6; in set_intercept_indicators_io()
210 static void set_intercept_indicators_ext(struct kvm_vcpu *vcpu) in set_intercept_indicators_ext() argument
212 if (!(pending_local_irqs(vcpu) & IRQ_PEND_EXT_MASK)) in set_intercept_indicators_ext()
214 if (psw_extint_disabled(vcpu)) in set_intercept_indicators_ext()
215 __set_cpuflag(vcpu, CPUSTAT_EXT_INT); in set_intercept_indicators_ext()
217 vcpu->arch.sie_block->lctl |= LCTL_CR0; in set_intercept_indicators_ext()
220 static void set_intercept_indicators_mchk(struct kvm_vcpu *vcpu) in set_intercept_indicators_mchk() argument
222 if (!(pending_local_irqs(vcpu) & IRQ_PEND_MCHK_MASK)) in set_intercept_indicators_mchk()
224 if (psw_mchk_disabled(vcpu)) in set_intercept_indicators_mchk()
225 vcpu->arch.sie_block->ictl |= ICTL_LPSW; in set_intercept_indicators_mchk()
227 vcpu->arch.sie_block->lctl |= LCTL_CR14; in set_intercept_indicators_mchk()
230 static void set_intercept_indicators_stop(struct kvm_vcpu *vcpu) in set_intercept_indicators_stop() argument
232 if (kvm_s390_is_stop_irq_pending(vcpu)) in set_intercept_indicators_stop()
233 __set_cpuflag(vcpu, CPUSTAT_STOP_INT); in set_intercept_indicators_stop()
237 static void set_intercept_indicators(struct kvm_vcpu *vcpu) in set_intercept_indicators() argument
239 set_intercept_indicators_io(vcpu); in set_intercept_indicators()
240 set_intercept_indicators_ext(vcpu); in set_intercept_indicators()
241 set_intercept_indicators_mchk(vcpu); in set_intercept_indicators()
242 set_intercept_indicators_stop(vcpu); in set_intercept_indicators()
245 static u16 get_ilc(struct kvm_vcpu *vcpu) in get_ilc() argument
247 switch (vcpu->arch.sie_block->icptcode) { in get_ilc()
254 return insn_length(vcpu->arch.sie_block->ipa >> 8); in get_ilc()
256 return vcpu->arch.sie_block->pgmilc; in get_ilc()
262 static int __must_check __deliver_cpu_timer(struct kvm_vcpu *vcpu) in __deliver_cpu_timer() argument
264 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_cpu_timer()
267 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_CPU_TIMER, in __deliver_cpu_timer()
270 rc = put_guest_lc(vcpu, EXT_IRQ_CPU_TIMER, in __deliver_cpu_timer()
272 rc |= put_guest_lc(vcpu, 0, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_cpu_timer()
273 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_cpu_timer()
274 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_cpu_timer()
275 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_cpu_timer()
276 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_cpu_timer()
281 static int __must_check __deliver_ckc(struct kvm_vcpu *vcpu) in __deliver_ckc() argument
283 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_ckc()
286 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_CLOCK_COMP, in __deliver_ckc()
289 rc = put_guest_lc(vcpu, EXT_IRQ_CLK_COMP, in __deliver_ckc()
291 rc |= put_guest_lc(vcpu, 0, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_ckc()
292 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_ckc()
293 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_ckc()
294 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_ckc()
295 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_ckc()
300 static int __must_check __deliver_pfault_init(struct kvm_vcpu *vcpu) in __deliver_pfault_init() argument
302 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_pfault_init()
312 VCPU_EVENT(vcpu, 4, "interrupt: pfault init parm:%x,parm64:%llx", in __deliver_pfault_init()
314 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_pfault_init()
318 rc = put_guest_lc(vcpu, EXT_IRQ_CP_SERVICE, (u16 *) __LC_EXT_INT_CODE); in __deliver_pfault_init()
319 rc |= put_guest_lc(vcpu, PFAULT_INIT, (u16 *) __LC_EXT_CPU_ADDR); in __deliver_pfault_init()
320 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_pfault_init()
321 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_pfault_init()
322 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_pfault_init()
323 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_pfault_init()
324 rc |= put_guest_lc(vcpu, ext.ext_params2, (u64 *) __LC_EXT_PARAMS2); in __deliver_pfault_init()
328 static int __must_check __deliver_machine_check(struct kvm_vcpu *vcpu) in __deliver_machine_check() argument
330 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_machine_check()
331 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_machine_check()
369 VCPU_EVENT(vcpu, 4, "interrupt: machine check mcic=%llx", in __deliver_machine_check()
371 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_machine_check()
375 rc = kvm_s390_vcpu_store_status(vcpu, in __deliver_machine_check()
377 rc |= read_guest_lc(vcpu, __LC_VX_SAVE_AREA_ADDR, in __deliver_machine_check()
380 rc |= kvm_s390_vcpu_store_adtl_status(vcpu, in __deliver_machine_check()
382 rc |= put_guest_lc(vcpu, mchk.mcic, in __deliver_machine_check()
384 rc |= put_guest_lc(vcpu, mchk.failing_storage_address, in __deliver_machine_check()
386 rc |= write_guest_lc(vcpu, __LC_PSW_SAVE_AREA, in __deliver_machine_check()
389 rc |= write_guest_lc(vcpu, __LC_MCK_OLD_PSW, in __deliver_machine_check()
390 &vcpu->arch.sie_block->gpsw, in __deliver_machine_check()
392 rc |= read_guest_lc(vcpu, __LC_MCK_NEW_PSW, in __deliver_machine_check()
393 &vcpu->arch.sie_block->gpsw, in __deliver_machine_check()
399 static int __must_check __deliver_restart(struct kvm_vcpu *vcpu) in __deliver_restart() argument
401 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_restart()
404 VCPU_EVENT(vcpu, 4, "%s", "interrupt: cpu restart"); in __deliver_restart()
405 vcpu->stat.deliver_restart_signal++; in __deliver_restart()
406 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_RESTART, 0, 0); in __deliver_restart()
408 rc = write_guest_lc(vcpu, in __deliver_restart()
410 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_restart()
411 rc |= read_guest_lc(vcpu, offsetof(struct _lowcore, restart_psw), in __deliver_restart()
412 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_restart()
417 static int __must_check __deliver_set_prefix(struct kvm_vcpu *vcpu) in __deliver_set_prefix() argument
419 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_set_prefix()
428 VCPU_EVENT(vcpu, 4, "interrupt: set prefix to %x", prefix.address); in __deliver_set_prefix()
429 vcpu->stat.deliver_prefix_signal++; in __deliver_set_prefix()
430 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_set_prefix()
434 kvm_s390_set_prefix(vcpu, prefix.address); in __deliver_set_prefix()
438 static int __must_check __deliver_emergency_signal(struct kvm_vcpu *vcpu) in __deliver_emergency_signal() argument
440 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_emergency_signal()
451 VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp emerg"); in __deliver_emergency_signal()
452 vcpu->stat.deliver_emergency_signal++; in __deliver_emergency_signal()
453 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_EMERGENCY, in __deliver_emergency_signal()
456 rc = put_guest_lc(vcpu, EXT_IRQ_EMERGENCY_SIG, in __deliver_emergency_signal()
458 rc |= put_guest_lc(vcpu, cpu_addr, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_emergency_signal()
459 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_emergency_signal()
460 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_emergency_signal()
461 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_emergency_signal()
462 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_emergency_signal()
466 static int __must_check __deliver_external_call(struct kvm_vcpu *vcpu) in __deliver_external_call() argument
468 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_external_call()
478 VCPU_EVENT(vcpu, 4, "%s", "interrupt: sigp ext call"); in __deliver_external_call()
479 vcpu->stat.deliver_external_call++; in __deliver_external_call()
480 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_external_call()
484 rc = put_guest_lc(vcpu, EXT_IRQ_EXTERNAL_CALL, in __deliver_external_call()
486 rc |= put_guest_lc(vcpu, extcall.code, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_external_call()
487 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_external_call()
488 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_external_call()
489 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, &vcpu->arch.sie_block->gpsw, in __deliver_external_call()
494 static int __must_check __deliver_prog(struct kvm_vcpu *vcpu) in __deliver_prog() argument
496 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_prog()
499 u16 ilc = get_ilc(vcpu); in __deliver_prog()
507 VCPU_EVENT(vcpu, 4, "interrupt: pgm check code:%x, ilc:%x", in __deliver_prog()
509 vcpu->stat.deliver_program_int++; in __deliver_prog()
510 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_PROGRAM_INT, in __deliver_prog()
526 rc = put_guest_lc(vcpu, pgm_info.trans_exc_code, in __deliver_prog()
535 rc = put_guest_lc(vcpu, pgm_info.exc_access_id, in __deliver_prog()
545 rc = put_guest_lc(vcpu, pgm_info.trans_exc_code, in __deliver_prog()
547 rc |= put_guest_lc(vcpu, pgm_info.exc_access_id, in __deliver_prog()
549 rc |= put_guest_lc(vcpu, pgm_info.op_access_id, in __deliver_prog()
554 rc = put_guest_lc(vcpu, pgm_info.mon_class_nr, in __deliver_prog()
556 rc |= put_guest_lc(vcpu, pgm_info.mon_code, in __deliver_prog()
561 rc = put_guest_lc(vcpu, pgm_info.data_exc_code, in __deliver_prog()
565 rc = put_guest_lc(vcpu, pgm_info.trans_exc_code, in __deliver_prog()
567 rc |= put_guest_lc(vcpu, pgm_info.exc_access_id, in __deliver_prog()
582 rc |= put_guest_lc(vcpu, pgm_info.per_code, in __deliver_prog()
584 rc |= put_guest_lc(vcpu, pgm_info.per_atmid, in __deliver_prog()
586 rc |= put_guest_lc(vcpu, pgm_info.per_address, in __deliver_prog()
588 rc |= put_guest_lc(vcpu, pgm_info.per_access_id, in __deliver_prog()
592 if (nullifying && vcpu->arch.sie_block->icptcode == ICPT_INST) in __deliver_prog()
593 kvm_s390_rewind_psw(vcpu, ilc); in __deliver_prog()
595 rc |= put_guest_lc(vcpu, ilc, (u16 *) __LC_PGM_ILC); in __deliver_prog()
596 rc |= put_guest_lc(vcpu, vcpu->arch.sie_block->gbea, in __deliver_prog()
598 rc |= put_guest_lc(vcpu, pgm_info.code, in __deliver_prog()
600 rc |= write_guest_lc(vcpu, __LC_PGM_OLD_PSW, in __deliver_prog()
601 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_prog()
602 rc |= read_guest_lc(vcpu, __LC_PGM_NEW_PSW, in __deliver_prog()
603 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_prog()
607 static int __must_check __deliver_service(struct kvm_vcpu *vcpu) in __deliver_service() argument
609 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_service()
623 VCPU_EVENT(vcpu, 4, "interrupt: sclp parm:%x", in __deliver_service()
625 vcpu->stat.deliver_service_signal++; in __deliver_service()
626 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_SERVICE, in __deliver_service()
629 rc = put_guest_lc(vcpu, EXT_IRQ_SERVICE_SIG, (u16 *)__LC_EXT_INT_CODE); in __deliver_service()
630 rc |= put_guest_lc(vcpu, 0, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_service()
631 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_service()
632 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_service()
633 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_service()
634 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_service()
635 rc |= put_guest_lc(vcpu, ext.ext_params, in __deliver_service()
641 static int __must_check __deliver_pfault_done(struct kvm_vcpu *vcpu) in __deliver_pfault_done() argument
643 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_pfault_done()
652 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_pfault_done()
663 rc = put_guest_lc(vcpu, EXT_IRQ_CP_SERVICE, in __deliver_pfault_done()
665 rc |= put_guest_lc(vcpu, PFAULT_DONE, in __deliver_pfault_done()
667 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_pfault_done()
668 &vcpu->arch.sie_block->gpsw, in __deliver_pfault_done()
670 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_pfault_done()
671 &vcpu->arch.sie_block->gpsw, in __deliver_pfault_done()
673 rc |= put_guest_lc(vcpu, inti->ext.ext_params2, in __deliver_pfault_done()
680 static int __must_check __deliver_virtio(struct kvm_vcpu *vcpu) in __deliver_virtio() argument
682 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_virtio()
691 VCPU_EVENT(vcpu, 4, in __deliver_virtio()
694 vcpu->stat.deliver_virtio_interrupt++; in __deliver_virtio()
695 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_virtio()
707 rc = put_guest_lc(vcpu, EXT_IRQ_CP_SERVICE, in __deliver_virtio()
709 rc |= put_guest_lc(vcpu, VIRTIO_PARAM, in __deliver_virtio()
711 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_virtio()
712 &vcpu->arch.sie_block->gpsw, in __deliver_virtio()
714 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_virtio()
715 &vcpu->arch.sie_block->gpsw, in __deliver_virtio()
717 rc |= put_guest_lc(vcpu, inti->ext.ext_params, in __deliver_virtio()
719 rc |= put_guest_lc(vcpu, inti->ext.ext_params2, in __deliver_virtio()
726 static int __must_check __deliver_io(struct kvm_vcpu *vcpu, in __deliver_io() argument
734 fi = &vcpu->kvm->arch.float_int; in __deliver_io()
742 VCPU_EVENT(vcpu, 4, "interrupt: I/O %llx", inti->type); in __deliver_io()
743 vcpu->stat.deliver_io_int++; in __deliver_io()
744 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_io()
758 rc = put_guest_lc(vcpu, inti->io.subchannel_id, in __deliver_io()
760 rc |= put_guest_lc(vcpu, inti->io.subchannel_nr, in __deliver_io()
762 rc |= put_guest_lc(vcpu, inti->io.io_int_parm, in __deliver_io()
764 rc |= put_guest_lc(vcpu, inti->io.io_int_word, in __deliver_io()
766 rc |= write_guest_lc(vcpu, __LC_IO_OLD_PSW, in __deliver_io()
767 &vcpu->arch.sie_block->gpsw, in __deliver_io()
769 rc |= read_guest_lc(vcpu, __LC_IO_NEW_PSW, in __deliver_io()
770 &vcpu->arch.sie_block->gpsw, in __deliver_io()
778 typedef int (*deliver_irq_t)(struct kvm_vcpu *vcpu);
797 int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu) in kvm_s390_ext_call_pending() argument
799 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_ext_call_pending()
800 uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; in kvm_s390_ext_call_pending()
806 (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_ECALL_PEND); in kvm_s390_ext_call_pending()
809 int kvm_s390_vcpu_has_irq(struct kvm_vcpu *vcpu, int exclude_stop) in kvm_s390_vcpu_has_irq() argument
813 rc = !!deliverable_irqs(vcpu); in kvm_s390_vcpu_has_irq()
815 if (!rc && kvm_cpu_has_pending_timer(vcpu)) in kvm_s390_vcpu_has_irq()
819 if (!rc && kvm_s390_ext_call_pending(vcpu) && in kvm_s390_vcpu_has_irq()
820 !psw_extint_disabled(vcpu) && in kvm_s390_vcpu_has_irq()
821 (vcpu->arch.sie_block->gcr[0] & 0x2000ul)) in kvm_s390_vcpu_has_irq()
824 if (!rc && !exclude_stop && kvm_s390_is_stop_irq_pending(vcpu)) in kvm_s390_vcpu_has_irq()
830 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) in kvm_cpu_has_pending_timer() argument
832 return ckc_irq_pending(vcpu) || cpu_timer_irq_pending(vcpu); in kvm_cpu_has_pending_timer()
835 int kvm_s390_handle_wait(struct kvm_vcpu *vcpu) in kvm_s390_handle_wait() argument
839 vcpu->stat.exit_wait_state++; in kvm_s390_handle_wait()
842 if (kvm_cpu_has_pending_timer(vcpu) || kvm_arch_vcpu_runnable(vcpu)) in kvm_s390_handle_wait()
845 if (psw_interrupts_disabled(vcpu)) { in kvm_s390_handle_wait()
846 VCPU_EVENT(vcpu, 3, "%s", "disabled wait"); in kvm_s390_handle_wait()
850 if (!ckc_interrupts_enabled(vcpu)) { in kvm_s390_handle_wait()
851 VCPU_EVENT(vcpu, 3, "%s", "enabled wait w/o timer"); in kvm_s390_handle_wait()
852 __set_cpu_idle(vcpu); in kvm_s390_handle_wait()
856 now = get_tod_clock_fast() + vcpu->arch.sie_block->epoch; in kvm_s390_handle_wait()
857 sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now); in kvm_s390_handle_wait()
860 if (vcpu->arch.sie_block->ckc < now) in kvm_s390_handle_wait()
863 __set_cpu_idle(vcpu); in kvm_s390_handle_wait()
864 hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL); in kvm_s390_handle_wait()
865 VCPU_EVENT(vcpu, 5, "enabled wait via clock comparator: %llx ns", sltime); in kvm_s390_handle_wait()
867 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx); in kvm_s390_handle_wait()
868 kvm_vcpu_block(vcpu); in kvm_s390_handle_wait()
869 __unset_cpu_idle(vcpu); in kvm_s390_handle_wait()
870 vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_s390_handle_wait()
872 hrtimer_cancel(&vcpu->arch.ckc_timer); in kvm_s390_handle_wait()
876 void kvm_s390_vcpu_wakeup(struct kvm_vcpu *vcpu) in kvm_s390_vcpu_wakeup() argument
878 if (waitqueue_active(&vcpu->wq)) { in kvm_s390_vcpu_wakeup()
883 vcpu->preempted = true; in kvm_s390_vcpu_wakeup()
884 wake_up_interruptible(&vcpu->wq); in kvm_s390_vcpu_wakeup()
885 vcpu->stat.halt_wakeup++; in kvm_s390_vcpu_wakeup()
891 struct kvm_vcpu *vcpu; in kvm_s390_idle_wakeup() local
894 vcpu = container_of(timer, struct kvm_vcpu, arch.ckc_timer); in kvm_s390_idle_wakeup()
895 now = get_tod_clock_fast() + vcpu->arch.sie_block->epoch; in kvm_s390_idle_wakeup()
896 sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now); in kvm_s390_idle_wakeup()
902 if (vcpu->arch.sie_block->ckc > now && in kvm_s390_idle_wakeup()
905 kvm_s390_vcpu_wakeup(vcpu); in kvm_s390_idle_wakeup()
909 void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu) in kvm_s390_clear_local_irqs() argument
911 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_clear_local_irqs()
921 vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl = 0; in kvm_s390_clear_local_irqs()
924 int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) in kvm_s390_deliver_pending_interrupts() argument
926 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_deliver_pending_interrupts()
932 __reset_intercept_indicators(vcpu); in kvm_s390_deliver_pending_interrupts()
936 if (ckc_irq_pending(vcpu)) in kvm_s390_deliver_pending_interrupts()
941 if (cpu_timer_irq_pending(vcpu)) in kvm_s390_deliver_pending_interrupts()
945 irqs = deliverable_irqs(vcpu); in kvm_s390_deliver_pending_interrupts()
951 rc = __deliver_io(vcpu, irq_type); in kvm_s390_deliver_pending_interrupts()
959 rc = func(vcpu); in kvm_s390_deliver_pending_interrupts()
965 set_intercept_indicators(vcpu); in kvm_s390_deliver_pending_interrupts()
970 static int __inject_prog(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_prog() argument
972 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_prog()
979 int kvm_s390_inject_program_int(struct kvm_vcpu *vcpu, u16 code) in kvm_s390_inject_program_int() argument
981 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_inject_program_int()
984 VCPU_EVENT(vcpu, 3, "inject: program check %d (from kernel)", code); in kvm_s390_inject_program_int()
985 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_PROGRAM_INT, code, in kvm_s390_inject_program_int()
989 __inject_prog(vcpu, &irq); in kvm_s390_inject_program_int()
995 int kvm_s390_inject_prog_irq(struct kvm_vcpu *vcpu, in kvm_s390_inject_prog_irq() argument
998 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_inject_prog_irq()
1002 VCPU_EVENT(vcpu, 3, "inject: prog irq %d (from kernel)", in kvm_s390_inject_prog_irq()
1004 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_PROGRAM_INT, in kvm_s390_inject_prog_irq()
1008 rc = __inject_prog(vcpu, &irq); in kvm_s390_inject_prog_irq()
1014 static int __inject_pfault_init(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_pfault_init() argument
1016 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_pfault_init()
1018 VCPU_EVENT(vcpu, 3, "inject: external irq params:%x, params2:%llx", in __inject_pfault_init()
1020 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_PFAULT_INIT, in __inject_pfault_init()
1030 static int __inject_extcall_sigpif(struct kvm_vcpu *vcpu, uint16_t src_id) in __inject_extcall_sigpif() argument
1033 uint8_t *sigp_ctrl = &vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; in __inject_extcall_sigpif()
1041 atomic_set_mask(CPUSTAT_ECALL_PEND, &vcpu->arch.sie_block->cpuflags); in __inject_extcall_sigpif()
1045 static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_extcall() argument
1047 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_extcall()
1051 VCPU_EVENT(vcpu, 3, "inject: external call source-cpu:%u", in __inject_extcall()
1053 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_EXTERNAL_CALL, in __inject_extcall()
1057 if (kvm_get_vcpu_by_id(vcpu->kvm, src_id) == NULL) in __inject_extcall()
1061 return __inject_extcall_sigpif(vcpu, src_id); in __inject_extcall()
1070 static int __inject_set_prefix(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_set_prefix() argument
1072 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_set_prefix()
1075 VCPU_EVENT(vcpu, 3, "inject: set prefix to %x (from user)", in __inject_set_prefix()
1077 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_SIGP_SET_PREFIX, in __inject_set_prefix()
1080 if (!is_vcpu_stopped(vcpu)) in __inject_set_prefix()
1089 static int __inject_sigp_stop(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_sigp_stop() argument
1091 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_sigp_stop()
1095 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_SIGP_STOP, 0, 0, 2); in __inject_sigp_stop()
1100 if (is_vcpu_stopped(vcpu)) { in __inject_sigp_stop()
1102 rc = kvm_s390_store_status_unloaded(vcpu, in __inject_sigp_stop()
1110 __set_cpuflag(vcpu, CPUSTAT_STOP_INT); in __inject_sigp_stop()
1114 static int __inject_sigp_restart(struct kvm_vcpu *vcpu, in __inject_sigp_restart() argument
1117 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_sigp_restart()
1119 VCPU_EVENT(vcpu, 3, "inject: restart type %llx", irq->type); in __inject_sigp_restart()
1120 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_RESTART, 0, 0, 2); in __inject_sigp_restart()
1126 static int __inject_sigp_emergency(struct kvm_vcpu *vcpu, in __inject_sigp_emergency() argument
1129 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_sigp_emergency()
1131 VCPU_EVENT(vcpu, 3, "inject: emergency %u\n", in __inject_sigp_emergency()
1133 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_EMERGENCY, in __inject_sigp_emergency()
1137 if (kvm_get_vcpu_by_id(vcpu->kvm, irq->u.emerg.code) == NULL) in __inject_sigp_emergency()
1146 static int __inject_mchk(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_mchk() argument
1148 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_mchk()
1151 VCPU_EVENT(vcpu, 5, "inject: machine check parm64:%llx", in __inject_mchk()
1153 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_MCHK, 0, in __inject_mchk()
1177 static int __inject_ckc(struct kvm_vcpu *vcpu) in __inject_ckc() argument
1179 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_ckc()
1181 VCPU_EVENT(vcpu, 3, "inject: type %x", KVM_S390_INT_CLOCK_COMP); in __inject_ckc()
1182 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_CLOCK_COMP, in __inject_ckc()
1190 static int __inject_cpu_timer(struct kvm_vcpu *vcpu) in __inject_cpu_timer() argument
1192 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_cpu_timer()
1194 VCPU_EVENT(vcpu, 3, "inject: type %x", KVM_S390_INT_CPU_TIMER); in __inject_cpu_timer()
1195 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_CPU_TIMER, in __inject_cpu_timer()
1503 int kvm_s390_is_stop_irq_pending(struct kvm_vcpu *vcpu) in kvm_s390_is_stop_irq_pending() argument
1505 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_is_stop_irq_pending()
1510 void kvm_s390_clear_stop_irq(struct kvm_vcpu *vcpu) in kvm_s390_clear_stop_irq() argument
1512 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_clear_stop_irq()
1520 static int do_inject_vcpu(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in do_inject_vcpu() argument
1526 VCPU_EVENT(vcpu, 3, "inject: program check %d (from user)", in do_inject_vcpu()
1528 rc = __inject_prog(vcpu, irq); in do_inject_vcpu()
1531 rc = __inject_set_prefix(vcpu, irq); in do_inject_vcpu()
1534 rc = __inject_sigp_stop(vcpu, irq); in do_inject_vcpu()
1537 rc = __inject_sigp_restart(vcpu, irq); in do_inject_vcpu()
1540 rc = __inject_ckc(vcpu); in do_inject_vcpu()
1543 rc = __inject_cpu_timer(vcpu); in do_inject_vcpu()
1546 rc = __inject_extcall(vcpu, irq); in do_inject_vcpu()
1549 rc = __inject_sigp_emergency(vcpu, irq); in do_inject_vcpu()
1552 rc = __inject_mchk(vcpu, irq); in do_inject_vcpu()
1555 rc = __inject_pfault_init(vcpu, irq); in do_inject_vcpu()
1567 int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in kvm_s390_inject_vcpu() argument
1569 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_inject_vcpu()
1573 rc = do_inject_vcpu(vcpu, irq); in kvm_s390_inject_vcpu()
1576 kvm_s390_vcpu_wakeup(vcpu); in kvm_s390_inject_vcpu()
1953 struct kvm_vcpu *vcpu; in flic_set_attr() local
1973 kvm_for_each_vcpu(i, vcpu, dev->kvm) in flic_set_attr()
1974 kvm_clear_async_pf_completion_queue(vcpu); in flic_set_attr()
2133 int kvm_s390_set_irq_state(struct kvm_vcpu *vcpu, void __user *irqstate, int len) in kvm_s390_set_irq_state() argument
2135 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_set_irq_state()
2160 r = do_inject_vcpu(vcpu, &buf[n]); in kvm_s390_set_irq_state()
2215 int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len) in kvm_s390_get_irq_state() argument
2217 uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; in kvm_s390_get_irq_state()
2219 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_get_irq_state()
2238 store_local_irq(&vcpu->arch.local_int, &irq, irq_type); in kvm_s390_get_irq_state()
2258 (atomic_read(&vcpu->arch.sie_block->cpuflags) & in kvm_s390_get_irq_state()