Lines Matching refs:vcpu

37 int psw_extint_disabled(struct kvm_vcpu *vcpu)  in psw_extint_disabled()  argument
39 return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_EXT); in psw_extint_disabled()
42 static int psw_ioint_disabled(struct kvm_vcpu *vcpu) in psw_ioint_disabled() argument
44 return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_IO); in psw_ioint_disabled()
47 static int psw_mchk_disabled(struct kvm_vcpu *vcpu) in psw_mchk_disabled() argument
49 return !(vcpu->arch.sie_block->gpsw.mask & PSW_MASK_MCHECK); in psw_mchk_disabled()
52 static int psw_interrupts_disabled(struct kvm_vcpu *vcpu) in psw_interrupts_disabled() argument
54 return psw_extint_disabled(vcpu) && in psw_interrupts_disabled()
55 psw_ioint_disabled(vcpu) && in psw_interrupts_disabled()
56 psw_mchk_disabled(vcpu); in psw_interrupts_disabled()
59 static int ckc_interrupts_enabled(struct kvm_vcpu *vcpu) in ckc_interrupts_enabled() argument
61 if (psw_extint_disabled(vcpu) || in ckc_interrupts_enabled()
62 !(vcpu->arch.sie_block->gcr[0] & 0x800ul)) in ckc_interrupts_enabled()
64 if (guestdbg_enabled(vcpu) && guestdbg_sstep_enabled(vcpu)) in ckc_interrupts_enabled()
70 static int ckc_irq_pending(struct kvm_vcpu *vcpu) in ckc_irq_pending() argument
72 if (vcpu->arch.sie_block->ckc >= kvm_s390_get_tod_clock_fast(vcpu->kvm)) in ckc_irq_pending()
74 return ckc_interrupts_enabled(vcpu); in ckc_irq_pending()
77 static int cpu_timer_interrupts_enabled(struct kvm_vcpu *vcpu) in cpu_timer_interrupts_enabled() argument
79 return !psw_extint_disabled(vcpu) && in cpu_timer_interrupts_enabled()
80 (vcpu->arch.sie_block->gcr[0] & 0x400ul); in cpu_timer_interrupts_enabled()
83 static int cpu_timer_irq_pending(struct kvm_vcpu *vcpu) in cpu_timer_irq_pending() argument
85 return (vcpu->arch.sie_block->cputm >> 63) && in cpu_timer_irq_pending()
86 cpu_timer_interrupts_enabled(vcpu); in cpu_timer_irq_pending()
105 static inline unsigned long pending_irqs(struct kvm_vcpu *vcpu) in pending_irqs() argument
107 return vcpu->kvm->arch.float_int.pending_irqs | in pending_irqs()
108 vcpu->arch.local_int.pending_irqs; in pending_irqs()
111 static unsigned long disable_iscs(struct kvm_vcpu *vcpu, in disable_iscs() argument
117 if (!(vcpu->arch.sie_block->gcr[6] & isc_to_isc_bits(i))) in disable_iscs()
123 static unsigned long deliverable_irqs(struct kvm_vcpu *vcpu) in deliverable_irqs() argument
127 active_mask = pending_irqs(vcpu); in deliverable_irqs()
131 if (psw_extint_disabled(vcpu)) in deliverable_irqs()
133 if (psw_ioint_disabled(vcpu)) in deliverable_irqs()
136 active_mask = disable_iscs(vcpu, active_mask); in deliverable_irqs()
137 if (!(vcpu->arch.sie_block->gcr[0] & 0x2000ul)) in deliverable_irqs()
139 if (!(vcpu->arch.sie_block->gcr[0] & 0x4000ul)) in deliverable_irqs()
141 if (!(vcpu->arch.sie_block->gcr[0] & 0x800ul)) in deliverable_irqs()
143 if (!(vcpu->arch.sie_block->gcr[0] & 0x400ul)) in deliverable_irqs()
145 if (!(vcpu->arch.sie_block->gcr[0] & 0x200ul)) in deliverable_irqs()
147 if (psw_mchk_disabled(vcpu)) in deliverable_irqs()
149 if (!(vcpu->arch.sie_block->gcr[14] & in deliverable_irqs()
150 vcpu->kvm->arch.float_int.mchk.cr14)) in deliverable_irqs()
162 static void __set_cpu_idle(struct kvm_vcpu *vcpu) in __set_cpu_idle() argument
164 atomic_or(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); in __set_cpu_idle()
165 set_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); in __set_cpu_idle()
168 static void __unset_cpu_idle(struct kvm_vcpu *vcpu) in __unset_cpu_idle() argument
170 atomic_andnot(CPUSTAT_WAIT, &vcpu->arch.sie_block->cpuflags); in __unset_cpu_idle()
171 clear_bit(vcpu->vcpu_id, vcpu->arch.local_int.float_int->idle_mask); in __unset_cpu_idle()
174 static void __reset_intercept_indicators(struct kvm_vcpu *vcpu) in __reset_intercept_indicators() argument
177 &vcpu->arch.sie_block->cpuflags); in __reset_intercept_indicators()
178 vcpu->arch.sie_block->lctl = 0x0000; in __reset_intercept_indicators()
179 vcpu->arch.sie_block->ictl &= ~(ICTL_LPSW | ICTL_STCTL | ICTL_PINT); in __reset_intercept_indicators()
181 if (guestdbg_enabled(vcpu)) { in __reset_intercept_indicators()
182 vcpu->arch.sie_block->lctl |= (LCTL_CR0 | LCTL_CR9 | in __reset_intercept_indicators()
184 vcpu->arch.sie_block->ictl |= (ICTL_STCTL | ICTL_PINT); in __reset_intercept_indicators()
188 static void __set_cpuflag(struct kvm_vcpu *vcpu, u32 flag) in __set_cpuflag() argument
190 atomic_or(flag, &vcpu->arch.sie_block->cpuflags); in __set_cpuflag()
193 static void set_intercept_indicators_io(struct kvm_vcpu *vcpu) in set_intercept_indicators_io() argument
195 if (!(pending_irqs(vcpu) & IRQ_PEND_IO_MASK)) in set_intercept_indicators_io()
197 else if (psw_ioint_disabled(vcpu)) in set_intercept_indicators_io()
198 __set_cpuflag(vcpu, CPUSTAT_IO_INT); in set_intercept_indicators_io()
200 vcpu->arch.sie_block->lctl |= LCTL_CR6; in set_intercept_indicators_io()
203 static void set_intercept_indicators_ext(struct kvm_vcpu *vcpu) in set_intercept_indicators_ext() argument
205 if (!(pending_irqs(vcpu) & IRQ_PEND_EXT_MASK)) in set_intercept_indicators_ext()
207 if (psw_extint_disabled(vcpu)) in set_intercept_indicators_ext()
208 __set_cpuflag(vcpu, CPUSTAT_EXT_INT); in set_intercept_indicators_ext()
210 vcpu->arch.sie_block->lctl |= LCTL_CR0; in set_intercept_indicators_ext()
213 static void set_intercept_indicators_mchk(struct kvm_vcpu *vcpu) in set_intercept_indicators_mchk() argument
215 if (!(pending_irqs(vcpu) & IRQ_PEND_MCHK_MASK)) in set_intercept_indicators_mchk()
217 if (psw_mchk_disabled(vcpu)) in set_intercept_indicators_mchk()
218 vcpu->arch.sie_block->ictl |= ICTL_LPSW; in set_intercept_indicators_mchk()
220 vcpu->arch.sie_block->lctl |= LCTL_CR14; in set_intercept_indicators_mchk()
223 static void set_intercept_indicators_stop(struct kvm_vcpu *vcpu) in set_intercept_indicators_stop() argument
225 if (kvm_s390_is_stop_irq_pending(vcpu)) in set_intercept_indicators_stop()
226 __set_cpuflag(vcpu, CPUSTAT_STOP_INT); in set_intercept_indicators_stop()
230 static void set_intercept_indicators(struct kvm_vcpu *vcpu) in set_intercept_indicators() argument
232 set_intercept_indicators_io(vcpu); in set_intercept_indicators()
233 set_intercept_indicators_ext(vcpu); in set_intercept_indicators()
234 set_intercept_indicators_mchk(vcpu); in set_intercept_indicators()
235 set_intercept_indicators_stop(vcpu); in set_intercept_indicators()
238 static u16 get_ilc(struct kvm_vcpu *vcpu) in get_ilc() argument
240 switch (vcpu->arch.sie_block->icptcode) { in get_ilc()
247 return insn_length(vcpu->arch.sie_block->ipa >> 8); in get_ilc()
249 return vcpu->arch.sie_block->pgmilc; in get_ilc()
255 static int __must_check __deliver_cpu_timer(struct kvm_vcpu *vcpu) in __deliver_cpu_timer() argument
257 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_cpu_timer()
260 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_CPU_TIMER, in __deliver_cpu_timer()
263 rc = put_guest_lc(vcpu, EXT_IRQ_CPU_TIMER, in __deliver_cpu_timer()
265 rc |= put_guest_lc(vcpu, 0, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_cpu_timer()
266 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_cpu_timer()
267 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_cpu_timer()
268 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_cpu_timer()
269 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_cpu_timer()
274 static int __must_check __deliver_ckc(struct kvm_vcpu *vcpu) in __deliver_ckc() argument
276 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_ckc()
279 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_CLOCK_COMP, in __deliver_ckc()
282 rc = put_guest_lc(vcpu, EXT_IRQ_CLK_COMP, in __deliver_ckc()
284 rc |= put_guest_lc(vcpu, 0, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_ckc()
285 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_ckc()
286 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_ckc()
287 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_ckc()
288 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_ckc()
293 static int __must_check __deliver_pfault_init(struct kvm_vcpu *vcpu) in __deliver_pfault_init() argument
295 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_pfault_init()
305 VCPU_EVENT(vcpu, 4, "deliver: pfault init token 0x%llx", in __deliver_pfault_init()
307 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_pfault_init()
311 rc = put_guest_lc(vcpu, EXT_IRQ_CP_SERVICE, (u16 *) __LC_EXT_INT_CODE); in __deliver_pfault_init()
312 rc |= put_guest_lc(vcpu, PFAULT_INIT, (u16 *) __LC_EXT_CPU_ADDR); in __deliver_pfault_init()
313 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_pfault_init()
314 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_pfault_init()
315 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_pfault_init()
316 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_pfault_init()
317 rc |= put_guest_lc(vcpu, ext.ext_params2, (u64 *) __LC_EXT_PARAMS2); in __deliver_pfault_init()
321 static int __must_check __deliver_machine_check(struct kvm_vcpu *vcpu) in __deliver_machine_check() argument
323 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_machine_check()
324 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_machine_check()
362 VCPU_EVENT(vcpu, 3, "deliver: machine check mcic 0x%llx", in __deliver_machine_check()
364 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_machine_check()
368 rc = kvm_s390_vcpu_store_status(vcpu, in __deliver_machine_check()
370 rc |= read_guest_lc(vcpu, __LC_VX_SAVE_AREA_ADDR, in __deliver_machine_check()
373 rc |= kvm_s390_vcpu_store_adtl_status(vcpu, in __deliver_machine_check()
375 rc |= put_guest_lc(vcpu, mchk.mcic, in __deliver_machine_check()
377 rc |= put_guest_lc(vcpu, mchk.failing_storage_address, in __deliver_machine_check()
379 rc |= write_guest_lc(vcpu, __LC_PSW_SAVE_AREA, in __deliver_machine_check()
382 rc |= write_guest_lc(vcpu, __LC_MCK_OLD_PSW, in __deliver_machine_check()
383 &vcpu->arch.sie_block->gpsw, in __deliver_machine_check()
385 rc |= read_guest_lc(vcpu, __LC_MCK_NEW_PSW, in __deliver_machine_check()
386 &vcpu->arch.sie_block->gpsw, in __deliver_machine_check()
392 static int __must_check __deliver_restart(struct kvm_vcpu *vcpu) in __deliver_restart() argument
394 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_restart()
397 VCPU_EVENT(vcpu, 3, "%s", "deliver: cpu restart"); in __deliver_restart()
398 vcpu->stat.deliver_restart_signal++; in __deliver_restart()
399 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_RESTART, 0, 0); in __deliver_restart()
401 rc = write_guest_lc(vcpu, in __deliver_restart()
403 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_restart()
404 rc |= read_guest_lc(vcpu, offsetof(struct _lowcore, restart_psw), in __deliver_restart()
405 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_restart()
410 static int __must_check __deliver_set_prefix(struct kvm_vcpu *vcpu) in __deliver_set_prefix() argument
412 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_set_prefix()
421 vcpu->stat.deliver_prefix_signal++; in __deliver_set_prefix()
422 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_set_prefix()
426 kvm_s390_set_prefix(vcpu, prefix.address); in __deliver_set_prefix()
430 static int __must_check __deliver_emergency_signal(struct kvm_vcpu *vcpu) in __deliver_emergency_signal() argument
432 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_emergency_signal()
443 VCPU_EVENT(vcpu, 4, "%s", "deliver: sigp emerg"); in __deliver_emergency_signal()
444 vcpu->stat.deliver_emergency_signal++; in __deliver_emergency_signal()
445 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_EMERGENCY, in __deliver_emergency_signal()
448 rc = put_guest_lc(vcpu, EXT_IRQ_EMERGENCY_SIG, in __deliver_emergency_signal()
450 rc |= put_guest_lc(vcpu, cpu_addr, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_emergency_signal()
451 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_emergency_signal()
452 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_emergency_signal()
453 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_emergency_signal()
454 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_emergency_signal()
458 static int __must_check __deliver_external_call(struct kvm_vcpu *vcpu) in __deliver_external_call() argument
460 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_external_call()
470 VCPU_EVENT(vcpu, 4, "%s", "deliver: sigp ext call"); in __deliver_external_call()
471 vcpu->stat.deliver_external_call++; in __deliver_external_call()
472 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_external_call()
476 rc = put_guest_lc(vcpu, EXT_IRQ_EXTERNAL_CALL, in __deliver_external_call()
478 rc |= put_guest_lc(vcpu, extcall.code, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_external_call()
479 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_external_call()
480 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_external_call()
481 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, &vcpu->arch.sie_block->gpsw, in __deliver_external_call()
486 static int __must_check __deliver_prog(struct kvm_vcpu *vcpu) in __deliver_prog() argument
488 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __deliver_prog()
491 u16 ilc = get_ilc(vcpu); in __deliver_prog()
499 VCPU_EVENT(vcpu, 3, "deliver: program irq code 0x%x, ilc:%d", in __deliver_prog()
501 vcpu->stat.deliver_program_int++; in __deliver_prog()
502 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_PROGRAM_INT, in __deliver_prog()
518 rc = put_guest_lc(vcpu, pgm_info.trans_exc_code, in __deliver_prog()
527 rc = put_guest_lc(vcpu, pgm_info.exc_access_id, in __deliver_prog()
537 rc = put_guest_lc(vcpu, pgm_info.trans_exc_code, in __deliver_prog()
539 rc |= put_guest_lc(vcpu, pgm_info.exc_access_id, in __deliver_prog()
541 rc |= put_guest_lc(vcpu, pgm_info.op_access_id, in __deliver_prog()
546 rc = put_guest_lc(vcpu, pgm_info.mon_class_nr, in __deliver_prog()
548 rc |= put_guest_lc(vcpu, pgm_info.mon_code, in __deliver_prog()
553 rc = put_guest_lc(vcpu, pgm_info.data_exc_code, in __deliver_prog()
557 rc = put_guest_lc(vcpu, pgm_info.trans_exc_code, in __deliver_prog()
559 rc |= put_guest_lc(vcpu, pgm_info.exc_access_id, in __deliver_prog()
574 rc |= put_guest_lc(vcpu, pgm_info.per_code, in __deliver_prog()
576 rc |= put_guest_lc(vcpu, pgm_info.per_atmid, in __deliver_prog()
578 rc |= put_guest_lc(vcpu, pgm_info.per_address, in __deliver_prog()
580 rc |= put_guest_lc(vcpu, pgm_info.per_access_id, in __deliver_prog()
584 if (nullifying && vcpu->arch.sie_block->icptcode == ICPT_INST) in __deliver_prog()
585 kvm_s390_rewind_psw(vcpu, ilc); in __deliver_prog()
587 rc |= put_guest_lc(vcpu, ilc, (u16 *) __LC_PGM_ILC); in __deliver_prog()
588 rc |= put_guest_lc(vcpu, vcpu->arch.sie_block->gbea, in __deliver_prog()
590 rc |= put_guest_lc(vcpu, pgm_info.code, in __deliver_prog()
592 rc |= write_guest_lc(vcpu, __LC_PGM_OLD_PSW, in __deliver_prog()
593 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_prog()
594 rc |= read_guest_lc(vcpu, __LC_PGM_NEW_PSW, in __deliver_prog()
595 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_prog()
599 static int __must_check __deliver_service(struct kvm_vcpu *vcpu) in __deliver_service() argument
601 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_service()
615 VCPU_EVENT(vcpu, 4, "deliver: sclp parameter 0x%x", in __deliver_service()
617 vcpu->stat.deliver_service_signal++; in __deliver_service()
618 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, KVM_S390_INT_SERVICE, in __deliver_service()
621 rc = put_guest_lc(vcpu, EXT_IRQ_SERVICE_SIG, (u16 *)__LC_EXT_INT_CODE); in __deliver_service()
622 rc |= put_guest_lc(vcpu, 0, (u16 *)__LC_EXT_CPU_ADDR); in __deliver_service()
623 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_service()
624 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_service()
625 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_service()
626 &vcpu->arch.sie_block->gpsw, sizeof(psw_t)); in __deliver_service()
627 rc |= put_guest_lc(vcpu, ext.ext_params, in __deliver_service()
633 static int __must_check __deliver_pfault_done(struct kvm_vcpu *vcpu) in __deliver_pfault_done() argument
635 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()
655 VCPU_EVENT(vcpu, 4, "deliver: pfault done token 0x%llx", in __deliver_pfault_done()
658 rc = put_guest_lc(vcpu, EXT_IRQ_CP_SERVICE, in __deliver_pfault_done()
660 rc |= put_guest_lc(vcpu, PFAULT_DONE, in __deliver_pfault_done()
662 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_pfault_done()
663 &vcpu->arch.sie_block->gpsw, in __deliver_pfault_done()
665 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_pfault_done()
666 &vcpu->arch.sie_block->gpsw, in __deliver_pfault_done()
668 rc |= put_guest_lc(vcpu, inti->ext.ext_params2, in __deliver_pfault_done()
675 static int __must_check __deliver_virtio(struct kvm_vcpu *vcpu) in __deliver_virtio() argument
677 struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; in __deliver_virtio()
686 VCPU_EVENT(vcpu, 4, in __deliver_virtio()
689 vcpu->stat.deliver_virtio_interrupt++; in __deliver_virtio()
690 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_virtio()
702 rc = put_guest_lc(vcpu, EXT_IRQ_CP_SERVICE, in __deliver_virtio()
704 rc |= put_guest_lc(vcpu, VIRTIO_PARAM, in __deliver_virtio()
706 rc |= write_guest_lc(vcpu, __LC_EXT_OLD_PSW, in __deliver_virtio()
707 &vcpu->arch.sie_block->gpsw, in __deliver_virtio()
709 rc |= read_guest_lc(vcpu, __LC_EXT_NEW_PSW, in __deliver_virtio()
710 &vcpu->arch.sie_block->gpsw, in __deliver_virtio()
712 rc |= put_guest_lc(vcpu, inti->ext.ext_params, in __deliver_virtio()
714 rc |= put_guest_lc(vcpu, inti->ext.ext_params2, in __deliver_virtio()
721 static int __must_check __deliver_io(struct kvm_vcpu *vcpu, in __deliver_io() argument
729 fi = &vcpu->kvm->arch.float_int; in __deliver_io()
737 VCPU_EVENT(vcpu, 4, "deliver: I/O 0x%llx", inti->type); in __deliver_io()
738 vcpu->stat.deliver_io_int++; in __deliver_io()
739 trace_kvm_s390_deliver_interrupt(vcpu->vcpu_id, in __deliver_io()
753 rc = put_guest_lc(vcpu, inti->io.subchannel_id, in __deliver_io()
755 rc |= put_guest_lc(vcpu, inti->io.subchannel_nr, in __deliver_io()
757 rc |= put_guest_lc(vcpu, inti->io.io_int_parm, in __deliver_io()
759 rc |= put_guest_lc(vcpu, inti->io.io_int_word, in __deliver_io()
761 rc |= write_guest_lc(vcpu, __LC_IO_OLD_PSW, in __deliver_io()
762 &vcpu->arch.sie_block->gpsw, in __deliver_io()
764 rc |= read_guest_lc(vcpu, __LC_IO_NEW_PSW, in __deliver_io()
765 &vcpu->arch.sie_block->gpsw, in __deliver_io()
773 typedef int (*deliver_irq_t)(struct kvm_vcpu *vcpu);
792 int kvm_s390_ext_call_pending(struct kvm_vcpu *vcpu) in kvm_s390_ext_call_pending() argument
794 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_ext_call_pending()
795 uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; in kvm_s390_ext_call_pending()
801 (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_ECALL_PEND); in kvm_s390_ext_call_pending()
804 int kvm_s390_vcpu_has_irq(struct kvm_vcpu *vcpu, int exclude_stop) in kvm_s390_vcpu_has_irq() argument
806 if (deliverable_irqs(vcpu)) in kvm_s390_vcpu_has_irq()
809 if (kvm_cpu_has_pending_timer(vcpu)) in kvm_s390_vcpu_has_irq()
813 if (kvm_s390_ext_call_pending(vcpu) && in kvm_s390_vcpu_has_irq()
814 !psw_extint_disabled(vcpu) && in kvm_s390_vcpu_has_irq()
815 (vcpu->arch.sie_block->gcr[0] & 0x2000ul)) in kvm_s390_vcpu_has_irq()
818 if (!exclude_stop && kvm_s390_is_stop_irq_pending(vcpu)) in kvm_s390_vcpu_has_irq()
823 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) in kvm_cpu_has_pending_timer() argument
825 return ckc_irq_pending(vcpu) || cpu_timer_irq_pending(vcpu); in kvm_cpu_has_pending_timer()
828 int kvm_s390_handle_wait(struct kvm_vcpu *vcpu) in kvm_s390_handle_wait() argument
832 vcpu->stat.exit_wait_state++; in kvm_s390_handle_wait()
835 if (kvm_arch_vcpu_runnable(vcpu)) in kvm_s390_handle_wait()
838 if (psw_interrupts_disabled(vcpu)) { in kvm_s390_handle_wait()
839 VCPU_EVENT(vcpu, 3, "%s", "disabled wait"); in kvm_s390_handle_wait()
843 if (!ckc_interrupts_enabled(vcpu)) { in kvm_s390_handle_wait()
844 VCPU_EVENT(vcpu, 3, "%s", "enabled wait w/o timer"); in kvm_s390_handle_wait()
845 __set_cpu_idle(vcpu); in kvm_s390_handle_wait()
849 now = kvm_s390_get_tod_clock_fast(vcpu->kvm); in kvm_s390_handle_wait()
850 sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now); in kvm_s390_handle_wait()
853 if (vcpu->arch.sie_block->ckc < now) in kvm_s390_handle_wait()
856 __set_cpu_idle(vcpu); in kvm_s390_handle_wait()
857 hrtimer_start(&vcpu->arch.ckc_timer, ktime_set (0, sltime) , HRTIMER_MODE_REL); in kvm_s390_handle_wait()
858 VCPU_EVENT(vcpu, 4, "enabled wait via clock comparator: %llu ns", sltime); in kvm_s390_handle_wait()
860 srcu_read_unlock(&vcpu->kvm->srcu, vcpu->srcu_idx); in kvm_s390_handle_wait()
861 kvm_vcpu_block(vcpu); in kvm_s390_handle_wait()
862 __unset_cpu_idle(vcpu); in kvm_s390_handle_wait()
863 vcpu->srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); in kvm_s390_handle_wait()
865 hrtimer_cancel(&vcpu->arch.ckc_timer); in kvm_s390_handle_wait()
869 void kvm_s390_vcpu_wakeup(struct kvm_vcpu *vcpu) in kvm_s390_vcpu_wakeup() argument
871 if (waitqueue_active(&vcpu->wq)) { in kvm_s390_vcpu_wakeup()
876 vcpu->preempted = true; in kvm_s390_vcpu_wakeup()
877 wake_up_interruptible(&vcpu->wq); in kvm_s390_vcpu_wakeup()
878 vcpu->stat.halt_wakeup++; in kvm_s390_vcpu_wakeup()
884 struct kvm_vcpu *vcpu; in kvm_s390_idle_wakeup() local
887 vcpu = container_of(timer, struct kvm_vcpu, arch.ckc_timer); in kvm_s390_idle_wakeup()
888 now = kvm_s390_get_tod_clock_fast(vcpu->kvm); in kvm_s390_idle_wakeup()
889 sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now); in kvm_s390_idle_wakeup()
895 if (vcpu->arch.sie_block->ckc > now && in kvm_s390_idle_wakeup()
898 kvm_s390_vcpu_wakeup(vcpu); in kvm_s390_idle_wakeup()
902 void kvm_s390_clear_local_irqs(struct kvm_vcpu *vcpu) in kvm_s390_clear_local_irqs() argument
904 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_clear_local_irqs()
914 vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl = 0; in kvm_s390_clear_local_irqs()
917 int __must_check kvm_s390_deliver_pending_interrupts(struct kvm_vcpu *vcpu) in kvm_s390_deliver_pending_interrupts() argument
919 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_deliver_pending_interrupts()
925 __reset_intercept_indicators(vcpu); in kvm_s390_deliver_pending_interrupts()
929 if (ckc_irq_pending(vcpu)) in kvm_s390_deliver_pending_interrupts()
934 if (cpu_timer_irq_pending(vcpu)) in kvm_s390_deliver_pending_interrupts()
937 while ((irqs = deliverable_irqs(vcpu)) && !rc) { in kvm_s390_deliver_pending_interrupts()
941 rc = __deliver_io(vcpu, irq_type); in kvm_s390_deliver_pending_interrupts()
949 rc = func(vcpu); in kvm_s390_deliver_pending_interrupts()
953 set_intercept_indicators(vcpu); in kvm_s390_deliver_pending_interrupts()
958 static int __inject_prog(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_prog() argument
960 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_prog()
962 VCPU_EVENT(vcpu, 3, "inject: program irq code 0x%x", irq->u.pgm.code); in __inject_prog()
963 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_PROGRAM_INT, in __inject_prog()
990 static int __inject_pfault_init(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_pfault_init() argument
992 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_pfault_init()
994 VCPU_EVENT(vcpu, 4, "inject: pfault init parameter block at 0x%llx", in __inject_pfault_init()
996 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_PFAULT_INIT, in __inject_pfault_init()
1006 static int __inject_extcall_sigpif(struct kvm_vcpu *vcpu, uint16_t src_id) in __inject_extcall_sigpif() argument
1009 uint8_t *sigp_ctrl = &vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; in __inject_extcall_sigpif()
1017 atomic_or(CPUSTAT_ECALL_PEND, &vcpu->arch.sie_block->cpuflags); in __inject_extcall_sigpif()
1021 static int __inject_extcall(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_extcall() argument
1023 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_extcall()
1027 VCPU_EVENT(vcpu, 4, "inject: external call source-cpu:%u", in __inject_extcall()
1029 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_EXTERNAL_CALL, in __inject_extcall()
1033 if (kvm_get_vcpu_by_id(vcpu->kvm, src_id) == NULL) in __inject_extcall()
1037 return __inject_extcall_sigpif(vcpu, src_id); in __inject_extcall()
1046 static int __inject_set_prefix(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_set_prefix() argument
1048 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_set_prefix()
1051 VCPU_EVENT(vcpu, 3, "inject: set prefix to %x", in __inject_set_prefix()
1053 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_SIGP_SET_PREFIX, in __inject_set_prefix()
1056 if (!is_vcpu_stopped(vcpu)) in __inject_set_prefix()
1065 static int __inject_sigp_stop(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_sigp_stop() argument
1067 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_sigp_stop()
1071 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_SIGP_STOP, 0, 0); in __inject_sigp_stop()
1076 if (is_vcpu_stopped(vcpu)) { in __inject_sigp_stop()
1078 rc = kvm_s390_store_status_unloaded(vcpu, in __inject_sigp_stop()
1086 __set_cpuflag(vcpu, CPUSTAT_STOP_INT); in __inject_sigp_stop()
1090 static int __inject_sigp_restart(struct kvm_vcpu *vcpu, in __inject_sigp_restart() argument
1093 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_sigp_restart()
1095 VCPU_EVENT(vcpu, 3, "%s", "inject: restart int"); in __inject_sigp_restart()
1096 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_RESTART, 0, 0); in __inject_sigp_restart()
1102 static int __inject_sigp_emergency(struct kvm_vcpu *vcpu, in __inject_sigp_emergency() argument
1105 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_sigp_emergency()
1107 VCPU_EVENT(vcpu, 4, "inject: emergency from cpu %u", in __inject_sigp_emergency()
1109 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_EMERGENCY, in __inject_sigp_emergency()
1113 if (kvm_get_vcpu_by_id(vcpu->kvm, irq->u.emerg.code) == NULL) in __inject_sigp_emergency()
1122 static int __inject_mchk(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in __inject_mchk() argument
1124 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_mchk()
1127 VCPU_EVENT(vcpu, 3, "inject: machine check mcic 0x%llx", in __inject_mchk()
1129 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_MCHK, 0, in __inject_mchk()
1153 static int __inject_ckc(struct kvm_vcpu *vcpu) in __inject_ckc() argument
1155 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_ckc()
1157 VCPU_EVENT(vcpu, 3, "%s", "inject: clock comparator external"); in __inject_ckc()
1158 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_CLOCK_COMP, in __inject_ckc()
1166 static int __inject_cpu_timer(struct kvm_vcpu *vcpu) in __inject_cpu_timer() argument
1168 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in __inject_cpu_timer()
1170 VCPU_EVENT(vcpu, 3, "%s", "inject: cpu timer external"); in __inject_cpu_timer()
1171 trace_kvm_s390_inject_vcpu(vcpu->vcpu_id, KVM_S390_INT_CPU_TIMER, in __inject_cpu_timer()
1494 int kvm_s390_is_stop_irq_pending(struct kvm_vcpu *vcpu) in kvm_s390_is_stop_irq_pending() argument
1496 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_is_stop_irq_pending()
1501 void kvm_s390_clear_stop_irq(struct kvm_vcpu *vcpu) in kvm_s390_clear_stop_irq() argument
1503 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_clear_stop_irq()
1511 static int do_inject_vcpu(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in do_inject_vcpu() argument
1517 rc = __inject_prog(vcpu, irq); in do_inject_vcpu()
1520 rc = __inject_set_prefix(vcpu, irq); in do_inject_vcpu()
1523 rc = __inject_sigp_stop(vcpu, irq); in do_inject_vcpu()
1526 rc = __inject_sigp_restart(vcpu, irq); in do_inject_vcpu()
1529 rc = __inject_ckc(vcpu); in do_inject_vcpu()
1532 rc = __inject_cpu_timer(vcpu); in do_inject_vcpu()
1535 rc = __inject_extcall(vcpu, irq); in do_inject_vcpu()
1538 rc = __inject_sigp_emergency(vcpu, irq); in do_inject_vcpu()
1541 rc = __inject_mchk(vcpu, irq); in do_inject_vcpu()
1544 rc = __inject_pfault_init(vcpu, irq); in do_inject_vcpu()
1556 int kvm_s390_inject_vcpu(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) in kvm_s390_inject_vcpu() argument
1558 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_inject_vcpu()
1562 rc = do_inject_vcpu(vcpu, irq); in kvm_s390_inject_vcpu()
1565 kvm_s390_vcpu_wakeup(vcpu); in kvm_s390_inject_vcpu()
1942 struct kvm_vcpu *vcpu; in flic_set_attr() local
1962 kvm_for_each_vcpu(i, vcpu, dev->kvm) in flic_set_attr()
1963 kvm_clear_async_pf_completion_queue(vcpu); in flic_set_attr()
2122 int kvm_s390_set_irq_state(struct kvm_vcpu *vcpu, void __user *irqstate, int len) in kvm_s390_set_irq_state() argument
2124 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_set_irq_state()
2149 r = do_inject_vcpu(vcpu, &buf[n]); in kvm_s390_set_irq_state()
2204 int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len) in kvm_s390_get_irq_state() argument
2206 uint8_t sigp_ctrl = vcpu->kvm->arch.sca->cpu[vcpu->vcpu_id].sigp_ctrl; in kvm_s390_get_irq_state()
2208 struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; in kvm_s390_get_irq_state()
2227 store_local_irq(&vcpu->arch.local_int, &irq, irq_type); in kvm_s390_get_irq_state()
2247 (atomic_read(&vcpu->arch.sie_block->cpuflags) & in kvm_s390_get_irq_state()