From: Jens Freimann <jf...@linux.vnet.ibm.com>

Let's make this a reusable function.

Signed-off-by: Jens Freimann <jf...@linux.vnet.ibm.com>
Acked-by: Cornelia Huck <cornelia.h...@de.ibm.com>
Acked-by: Christian Borntraeger <borntrae...@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntrae...@de.ibm.com>
---
 arch/s390/kvm/interrupt.c | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c
index 6c9428e..71bf7e7 100644
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -206,11 +206,30 @@ static void __set_intercept_indicator(struct kvm_vcpu 
*vcpu,
        }
 }
 
+static u16 get_ilc(struct kvm_vcpu *vcpu)
+{
+       const unsigned short table[] = { 2, 4, 4, 6 };
+
+       switch (vcpu->arch.sie_block->icptcode) {
+       case ICPT_INST:
+       case ICPT_INSTPROGI:
+       case ICPT_OPEREXC:
+       case ICPT_PARTEXEC:
+       case ICPT_IOINST:
+               /* last instruction only stored for these icptcodes */
+               return table[vcpu->arch.sie_block->ipa >> 14];
+       case ICPT_PROGI:
+               return vcpu->arch.sie_block->pgmilc;
+       default:
+               return 0;
+       }
+}
+
 static int __deliver_prog_irq(struct kvm_vcpu *vcpu,
                              struct kvm_s390_pgm_info *pgm_info)
 {
-       const unsigned short table[] = { 2, 4, 4, 6 };
        int rc = 0;
+       u16 ilc = get_ilc(vcpu);
 
        switch (pgm_info->code & ~PGM_PER) {
        case PGM_AFX_TRANSLATION:
@@ -277,25 +296,7 @@ static int __deliver_prog_irq(struct kvm_vcpu *vcpu,
                                   (u8 *) __LC_PER_ACCESS_ID);
        }
 
-       switch (vcpu->arch.sie_block->icptcode) {
-       case ICPT_INST:
-       case ICPT_INSTPROGI:
-       case ICPT_OPEREXC:
-       case ICPT_PARTEXEC:
-       case ICPT_IOINST:
-               /* last instruction only stored for these icptcodes */
-               rc |= put_guest_lc(vcpu, table[vcpu->arch.sie_block->ipa >> 14],
-                                  (u16 *) __LC_PGM_ILC);
-               break;
-       case ICPT_PROGI:
-               rc |= put_guest_lc(vcpu, vcpu->arch.sie_block->pgmilc,
-                                  (u16 *) __LC_PGM_ILC);
-               break;
-       default:
-               rc |= put_guest_lc(vcpu, 0,
-                                  (u16 *) __LC_PGM_ILC);
-       }
-
+       rc |= put_guest_lc(vcpu, ilc, (u16 *) __LC_PGM_ILC);
        rc |= put_guest_lc(vcpu, pgm_info->code,
                           (u16 *)__LC_PGM_INT_CODE);
        rc |= write_guest_lc(vcpu, __LC_PGM_OLD_PSW,
-- 
1.8.4.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to