]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
s390/cio/ioasm: Fix __xsch() condition code handling
authorHeiko Carstens <hca@linux.ibm.com>
Thu, 25 Sep 2025 08:45:17 +0000 (10:45 +0200)
committerAlexander Gordeev <agordeev@linux.ibm.com>
Mon, 29 Sep 2025 11:52:08 +0000 (13:52 +0200)
For the __xsch() inline assembly the conversion to flag output macros is
incomplete. Only the conditional shift of the return value was added, while
the required changes to the inline assembly itself are missing.

If compiled with GCC versions before 14.2 this leads to a double shift of
the cc output operand and therefore the returned value of __xsch() is
incorrectly always zero, instead of the expected condition code.

Fixes: e200565d434b ("s390/cio/ioasm: Convert to use flag output macros")
Cc: stable@vger.kernel.org
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Acked-by: Alexander Gordeev <agordeev@linux.ibm.com>
Reviewed-by: Juergen Christ <jchrist@linux.ibm.com>
Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
drivers/s390/cio/ioasm.c

index a540045b64a6ef733a7b96a5c52716762c6063d0..8b06b234e1101cdfc2ee8e239310cbfa0911cb37 100644 (file)
@@ -253,11 +253,10 @@ static inline int __xsch(struct subchannel_id schid)
        asm volatile(
                "       lgr     1,%[r1]\n"
                "       xsch\n"
-               "       ipm     %[cc]\n"
-               "       srl     %[cc],28\n"
-               : [cc] "=&d" (ccode)
+               CC_IPM(cc)
+               : CC_OUT(cc, ccode)
                : [r1] "d" (r1)
-               : "cc", "1");
+               : CC_CLOBBER_LIST("1"));
        return CC_TRANSFORM(ccode);
 }