]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/traps: Fix test_monitor_call() inline assembly
authorHeiko Carstens <hca@linux.ibm.com>
Tue, 25 Feb 2025 09:53:10 +0000 (10:53 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Tue, 4 Mar 2025 16:15:18 +0000 (17:15 +0100)
The test_monitor_call() inline assembly uses the xgr instruction, which
also modifies the condition code, to clear a register. However the clobber
list of the inline assembly does not specify that the condition code is
modified, which may lead to incorrect code generation.

Use the lhi instruction instead to clear the register without that the
condition code is modified. Furthermore this limits clearing to the lower
32 bits of val, since its type is int.

Fixes: 17248ea03674 ("s390: fix __EMIT_BUG() macro")
Cc: stable@vger.kernel.org
Reviewed-by: Juergen Christ <jchrist@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/kernel/traps.c

index 24fee11b030d8bd5f6dbee7ae259998b97e3c3e4..b746213d3110c95a3108291438e8a7414a94c0d8 100644 (file)
@@ -285,10 +285,10 @@ static void __init test_monitor_call(void)
                return;
        asm volatile(
                "       mc      0,0\n"
-               "0:     xgr     %0,%0\n"
+               "0:     lhi     %[val],0\n"
                "1:\n"
-               EX_TABLE(0b,1b)
-               : "+d" (val));
+               EX_TABLE(0b, 1b)
+               : [val] "+d" (val));
        if (!val)
                panic("Monitor call doesn't work!\n");
 }