s390: fix register clobbering in CALL_ON_STACK
authorVasily Gorbik <gor@linux.ibm.com>
Mon, 25 Nov 2019 12:34:59 +0000 (13:34 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Sat, 30 Nov 2019 09:52:47 +0000 (10:52 +0100)
CALL_ON_STACK defines and initializes register variables. Inline
assembly which follows might trigger compiler to generate memory access
for "stack" argument (e.g. in case of S390_lowcore.nodat_stack). This
memory access produces a function call under kasan with outline
instrumentation which clobbers registers.

Switch "stack" argument in CALL_ON_STACK helper to use memory reference
constraint and perform load instead.

Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/stacktrace.h

index 4725315..ee056f4 100644 (file)
@@ -112,12 +112,12 @@ struct stack_frame {
                                                                        \
        asm volatile(                                                   \
                "       la      %[_prev],0(15)\n"                       \
-               "       la      15,0(%[_stack])\n"                      \
+               "       lg      15,%[_stack]\n"                         \
                "       stg     %[_frame],%[_bc](15)\n"                 \
                "       brasl   14,%[_fn]\n"                            \
                "       la      15,0(%[_prev])\n"                       \
                : [_prev] "=&a" (prev), CALL_FMT_##nr                   \
-                 [_stack] "a" (stack),                                 \
+                 [_stack] "R" (stack),                                 \
                  [_bc] "i" (offsetof(struct stack_frame, back_chain)), \
                  [_frame] "d" (frame),                                 \
                  [_fn] "X" (fn) : CALL_CLOBBER_##nr);                  \