diff options
Diffstat (limited to 'arch/s390/kvm')
| -rw-r--r-- | arch/s390/kvm/diag.c | 2 | ||||
| -rw-r--r-- | arch/s390/kvm/interrupt.c | 7 | ||||
| -rw-r--r-- | arch/s390/kvm/kvm-s390.c | 13 | 
3 files changed, 17 insertions, 5 deletions
| diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c index f639a152869f..a0775e1f08df 100644 --- a/arch/s390/kvm/diag.c +++ b/arch/s390/kvm/diag.c @@ -20,7 +20,7 @@ static int __diag_time_slice_end(struct kvm_vcpu *vcpu)  	VCPU_EVENT(vcpu, 5, "%s", "diag time slice end");  	vcpu->stat.diagnose_44++;  	vcpu_put(vcpu); -	schedule(); +	yield();  	vcpu_load(vcpu);  	return 0;  } diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index fcd1ed8015c1..84a7fed4cd4e 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -339,6 +339,11 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)  	if (kvm_cpu_has_interrupt(vcpu))  		return 0; +	__set_cpu_idle(vcpu); +	spin_lock_bh(&vcpu->arch.local_int.lock); +	vcpu->arch.local_int.timer_due = 0; +	spin_unlock_bh(&vcpu->arch.local_int.lock); +  	if (psw_interrupts_disabled(vcpu)) {  		VCPU_EVENT(vcpu, 3, "%s", "disabled wait");  		__unset_cpu_idle(vcpu); @@ -366,8 +371,6 @@ int kvm_s390_handle_wait(struct kvm_vcpu *vcpu)  no_timer:  	spin_lock_bh(&vcpu->arch.local_int.float_int->lock);  	spin_lock_bh(&vcpu->arch.local_int.lock); -	__set_cpu_idle(vcpu); -	vcpu->arch.local_int.timer_due = 0;  	add_wait_queue(&vcpu->arch.local_int.wq, &wait);  	while (list_empty(&vcpu->arch.local_int.list) &&  		list_empty(&vcpu->arch.local_int.float_int->list) && diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 0ac36a649eba..6558b09ff579 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -423,6 +423,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,  	return -EINVAL; /* not implemented yet */  } +extern void s390_handle_mcck(void); +  static void __vcpu_run(struct kvm_vcpu *vcpu)  {  	memcpy(&vcpu->arch.sie_block->gg14, &vcpu->arch.guest_gprs[14], 16); @@ -430,13 +432,21 @@ static void __vcpu_run(struct kvm_vcpu *vcpu)  	if (need_resched())  		schedule(); +	if (test_thread_flag(TIF_MCCK_PENDING)) +		s390_handle_mcck(); + +	kvm_s390_deliver_pending_interrupts(vcpu); +  	vcpu->arch.sie_block->icptcode = 0;  	local_irq_disable();  	kvm_guest_enter();  	local_irq_enable();  	VCPU_EVENT(vcpu, 6, "entering sie flags %x",  		   atomic_read(&vcpu->arch.sie_block->cpuflags)); -	sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs); +	if (sie64a(vcpu->arch.sie_block, vcpu->arch.guest_gprs)) { +		VCPU_EVENT(vcpu, 3, "%s", "fault in sie instruction"); +		kvm_s390_inject_program_int(vcpu, PGM_ADDRESSING); +	}  	VCPU_EVENT(vcpu, 6, "exit sie icptcode %d",  		   vcpu->arch.sie_block->icptcode);  	local_irq_disable(); @@ -475,7 +485,6 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)  	might_sleep();  	do { -		kvm_s390_deliver_pending_interrupts(vcpu);  		__vcpu_run(vcpu);  		rc = kvm_handle_sie_intercept(vcpu);  	} while (!signal_pending(current) && !rc); | 
