]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/commitdiff
KVM: s390: allow injecting all kinds of machine checks
authorJens Freimann <jfrei@linux.vnet.ibm.com>
Wed, 13 Aug 2014 08:09:04 +0000 (10:09 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Fri, 28 Nov 2014 12:59:05 +0000 (13:59 +0100)
Allow to specify CR14, logout area, external damage code
and failed storage address.

Since more then one machine check can be indicated to the guest at
a time we need to combine all indication bits with already pending
requests.

Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/interrupt.c

index 1aa7f2845ca8ce9d5c09c11a5859cbff033095ea..b3d4409fcf3faacdc00d9ed3c12f29877e87af06 100644 (file)
@@ -1063,11 +1063,19 @@ static int __inject_mchk(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq)
                                   mchk->mcic, 2);
 
        /*
-        * Combine mcic with previously injected machine checks and
-        * indicate them all together as described in the Principles
-        * of Operation, Chapter 11, Interruption action
+        * Because repressible machine checks can be indicated along with
+        * exigent machine checks (PoP, Chapter 11, Interruption action)
+        * we need to combine cr14, mcic and external damage code.
+        * Failing storage address and the logout area should not be or'ed
+        * together, we just indicate the last occurrence of the corresponding
+        * machine check
         */
+       mchk->cr14 |= irq->u.mchk.cr14;
        mchk->mcic |= irq->u.mchk.mcic;
+       mchk->ext_damage_code |= irq->u.mchk.ext_damage_code;
+       mchk->failing_storage_address = irq->u.mchk.failing_storage_address;
+       memcpy(&mchk->fixed_logout, &irq->u.mchk.fixed_logout,
+              sizeof(mchk->fixed_logout));
        if (mchk->mcic & MCHK_EX_MASK)
                set_bit(IRQ_PEND_MCHK_EX, &li->pending_irqs);
        else if (mchk->mcic & MCHK_REP_MASK)