Program irq injection during program irq intercepts is the last candidates
that injects nullifying irqs and relies on delivery to do the right thing.
As we should not rely on the icptcode during any delivery (because that
value will not be migrated), let's add a flag, telling prog IRQ delivery
to not rewind the PSW in case of nullifying prog IRQs.
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
 {
        struct kvm_s390_pgm_info pgm_info = {
                .code = vcpu->arch.sie_block->iprcc,
+               /* the PSW has already been rewound */
+               .flags = KVM_S390_PGM_FLAGS_NO_REWIND,
        };
 
        switch (vcpu->arch.sie_block->iprcc & ~PGM_PER) {
 
                                   (u8 *) __LC_PER_ACCESS_ID);
        }
 
-       if (nullifying && vcpu->arch.sie_block->icptcode == ICPT_INST)
+       if (nullifying && !(pgm_info.flags & KVM_S390_PGM_FLAGS_NO_REWIND))
                kvm_s390_rewind_psw(vcpu, ilen);
 
        /* bit 1+2 of the target are the ilc, so we can directly use ilen */
 
 #define KVM_S390_PGM_FLAGS_ILC_0       0x02
 #define KVM_S390_PGM_FLAGS_ILC_1       0x04
 #define KVM_S390_PGM_FLAGS_ILC_MASK    0x06
+#define KVM_S390_PGM_FLAGS_NO_REWIND   0x08
        __u8 flags;
        __u8 pad[2];
 };