@@ -445,6 +445,8 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
445445
446446static void __vcpu_run (struct kvm_vcpu * vcpu )
447447{
448+ int rc ;
449+
448450 memcpy (& vcpu -> arch .sie_block -> gg14 , & vcpu -> arch .guest_gprs [14 ], 16 );
449451
450452 if (need_resched ())
@@ -455,21 +457,24 @@ static void __vcpu_run(struct kvm_vcpu *vcpu)
455457
456458 kvm_s390_deliver_pending_interrupts (vcpu );
457459
460+ VCPU_EVENT (vcpu , 6 , "entering sie flags %x" ,
461+ atomic_read (& vcpu -> arch .sie_block -> cpuflags ));
462+
458463 vcpu -> arch .sie_block -> icptcode = 0 ;
459464 local_irq_disable ();
460465 kvm_guest_enter ();
461466 local_irq_enable ();
462- VCPU_EVENT (vcpu , 6 , "entering sie flags %x" ,
463- atomic_read (& vcpu -> arch .sie_block -> cpuflags ));
464- if (sie64a (vcpu -> arch .sie_block , vcpu -> arch .guest_gprs )) {
467+ rc = sie64a (vcpu -> arch .sie_block , vcpu -> arch .guest_gprs );
468+ local_irq_disable ();
469+ kvm_guest_exit ();
470+ local_irq_enable ();
471+
472+ if (rc ) {
465473 VCPU_EVENT (vcpu , 3 , "%s" , "fault in sie instruction" );
466474 kvm_s390_inject_program_int (vcpu , PGM_ADDRESSING );
467475 }
468476 VCPU_EVENT (vcpu , 6 , "exit sie icptcode %d" ,
469477 vcpu -> arch .sie_block -> icptcode );
470- local_irq_disable ();
471- kvm_guest_exit ();
472- local_irq_enable ();
473478
474479 memcpy (& vcpu -> arch .guest_gprs [14 ], & vcpu -> arch .sie_block -> gg14 , 16 );
475480}
0 commit comments