]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/pci: Fix __pcilg_mio_inuser() inline assembly
authorHeiko Carstens <hca@linux.ibm.com>
Mon, 19 May 2025 16:07:11 +0000 (18:07 +0200)
committerHeiko Carstens <hca@linux.ibm.com>
Wed, 21 May 2025 10:02:27 +0000 (12:02 +0200)
Use "a" constraint for the shift operand of the __pcilg_mio_inuser() inline
assembly. The used "d" constraint allows the compiler to use any general
purpose register for the shift operand, including register zero.

If register zero is used this my result in incorrect code generation:

 8f6:   a7 0a ff f8             ahi     %r0,-8
 8fa:   eb 32 00 00 00 0c       srlg    %r3,%r2,0  <----

If register zero is selected to contain the shift value, the srlg
instruction ignores the contents of the register and always shifts zero
bits. Therefore use the "a" constraint which does not permit to select
register zero.

Fixes: f058599e22d5 ("s390/pci: Fix s390_mmio_read/write with MIO")
Cc: stable@vger.kernel.org
Reported-by: Niklas Schnelle <schnelle@linux.ibm.com>
Reviewed-by: Niklas Schnelle <schnelle@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/pci/pci_mmio.c

index 9680055edb784058442d75f6e4cb561db7b25b5a..51e7a28af8994ad8199918ebaabc32a00416437b 100644 (file)
@@ -244,7 +244,7 @@ static inline int __pcilg_mio_inuser(
                : [ioaddr_len] "+&d" (ioaddr_len.pair), [exc] "+d" (exception),
                  CC_OUT(cc, cc), [val] "=d" (val),
                  [dst] "+a" (dst), [cnt] "+d" (cnt), [tmp] "=d" (tmp),
-                 [shift] "+d" (shift)
+                 [shift] "+a" (shift)
                :
                : CC_CLOBBER_LIST("memory"));
        disable_sacf_uaccess(sacf_flag);