]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: s390: pci: Fix aisb calculation
authorMatthew Rosato <mjrosato@linux.ibm.com>
Fri, 24 Apr 2026 19:39:00 +0000 (15:39 -0400)
committerChristian Borntraeger <borntraeger@linux.ibm.com>
Mon, 27 Apr 2026 09:14:45 +0000 (11:14 +0200)
The current implementation of aisb calculation will erroneously index
via an unsigned long * as well as multiply by 8B for every 64-bits in
the offset; only one or the other is required.  This throws off aisb
calculations once the number of devices exceeds 64, and can result
in out-of-bounds access as well as failure to indicate summary bits
associated with those devices in guests.

Fix this by converting to a physical address before applying the
offset, as is already done in arch/s390/pci/pci_irq.c.

Fixes: 3c5a1b6f0a18 ("KVM: s390: pci: provide routines for enabling/disabling interrupt forwarding")
Signed-off-by: Matthew Rosato <mjrosato@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@linux.ibm.com>
arch/s390/kvm/pci.c

index eed45af1a92d48b5aac396473959895353ed81de..5b075c38998e31d32993068852bbb1a843d35776 100644 (file)
@@ -166,7 +166,7 @@ static int kvm_zpci_set_airq(struct zpci_dev *zdev)
        fib.fmt0.noi = airq_iv_end(zdev->aibv);
        fib.fmt0.aibv = virt_to_phys(zdev->aibv->vector);
        fib.fmt0.aibvo = 0;
-       fib.fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8);
+       fib.fmt0.aisb = virt_to_phys(aift->sbv->vector) + (zdev->aisb / 64) * 8;
        fib.fmt0.aisbo = zdev->aisb & 63;
        fib.gd = zdev->gisa;
 
@@ -308,7 +308,7 @@ static int kvm_s390_pci_aif_enable(struct zpci_dev *zdev, struct zpci_fib *fib,
 
        /* Update guest FIB for re-issue */
        fib->fmt0.aisbo = zdev->aisb & 63;
-       fib->fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8);
+       fib->fmt0.aisb = virt_to_phys(aift->sbv->vector) + (zdev->aisb / 64) * 8;
        fib->fmt0.isc = gisc;
 
        /* Save some guest fib values in the host for later use */