]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 28 May 2018 07:54:17 +0000 (09:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 28 May 2018 07:54:17 +0000 (09:54 +0200)
added patches:
s390-ftrace-use-expoline-for-indirect-branches.patch

queue-4.4/s390-ftrace-use-expoline-for-indirect-branches.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/s390-ftrace-use-expoline-for-indirect-branches.patch b/queue-4.4/s390-ftrace-use-expoline-for-indirect-branches.patch
new file mode 100644 (file)
index 0000000..10fb6c7
--- /dev/null
@@ -0,0 +1,143 @@
+From 23a4d7fd34856da8218c4cfc23dba7a6ec0a423a Mon Sep 17 00:00:00 2001
+From: Martin Schwidefsky <schwidefsky@de.ibm.com>
+Date: Wed, 25 Apr 2018 18:35:26 +0200
+Subject: s390/ftrace: use expoline for indirect branches
+
+From: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+commit 23a4d7fd34856da8218c4cfc23dba7a6ec0a423a upstream.
+
+The return from the ftrace_stub, _mcount, ftrace_caller and
+return_to_handler functions is done with "br %r14" and "br %r1".
+These are indirect branches as well and need to use execute
+trampolines for CONFIG_EXPOLINE=y.
+
+The ftrace_caller function is a special case as it returns to the
+start of a function and may only use %r0 and %r1. For a pre z10
+machine the standard execute trampoline uses a LARL + EX to do
+this, but this requires *two* registers in the range %r1..%r15.
+To get around this the 'br %r1' located in the lowcore is used,
+then the EX instruction does not need an address register.
+But the lowcore trick may only be used for pre z14 machines,
+with noexec=on the mapping for the first page may not contain
+instructions. The solution for that is an ALTERNATIVE in the
+expoline THUNK generated by 'GEN_BR_THUNK %r1' to switch to
+EXRL, this relies on the fact that a machine that supports
+noexec=on has EXRL as well.
+
+Cc: stable@vger.kernel.org # 4.16
+Fixes: f19fbd5ed6 ("s390: introduce execute-trampolines for branches")
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/s390/include/asm/nospec-insn.h |   13 +++++++++++++
+ arch/s390/kernel/asm-offsets.c      |    1 +
+ arch/s390/kernel/mcount.S           |   14 +++++++++-----
+ 3 files changed, 23 insertions(+), 5 deletions(-)
+
+--- a/arch/s390/include/asm/nospec-insn.h
++++ b/arch/s390/include/asm/nospec-insn.h
+@@ -2,10 +2,15 @@
+ #ifndef _ASM_S390_NOSPEC_ASM_H
+ #define _ASM_S390_NOSPEC_ASM_H
++#include <asm/alternative-asm.h>
++#include <asm/asm-offsets.h>
++
+ #ifdef __ASSEMBLY__
+ #ifdef CONFIG_EXPOLINE
++_LC_BR_R1 = __LC_BR_R1
++
+ /*
+  * The expoline macros are used to create thunks in the same format
+  * as gcc generates them. The 'comdat' section flag makes sure that
+@@ -101,13 +106,21 @@
+       .endm
+       .macro __THUNK_EX_BR reg,ruse
++      # Be very careful when adding instructions to this macro!
++      # The ALTERNATIVE replacement code has a .+10 which targets
++      # the "br \reg" after the code has been patched.
+ #ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
+       exrl    0,555f
+       j       .
+ #else
++      .ifc \reg,%r1
++      ALTERNATIVE "ex %r0,_LC_BR_R1", ".insn ril,0xc60000000000,0,.+10", 35
++      j       .
++      .else
+       larl    \ruse,555f
+       ex      0,0(\ruse)
+       j       .
++      .endif
+ #endif
+ 555:  br      \reg
+       .endm
+--- a/arch/s390/kernel/asm-offsets.c
++++ b/arch/s390/kernel/asm-offsets.c
+@@ -170,6 +170,7 @@ int main(void)
+       OFFSET(__LC_MACHINE_FLAGS, _lowcore, machine_flags);
+       OFFSET(__LC_GMAP, _lowcore, gmap);
+       OFFSET(__LC_PASTE, _lowcore, paste);
++      OFFSET(__LC_BR_R1, _lowcore, br_r1_trampoline);
+       /* software defined ABI-relevant lowcore locations 0xe00 - 0xe20 */
+       OFFSET(__LC_DUMP_REIPL, _lowcore, ipib);
+       /* hardware defined lowcore locations 0x1000 - 0x18ff */
+--- a/arch/s390/kernel/mcount.S
++++ b/arch/s390/kernel/mcount.S
+@@ -8,12 +8,16 @@
+ #include <linux/linkage.h>
+ #include <asm/asm-offsets.h>
+ #include <asm/ftrace.h>
++#include <asm/nospec-insn.h>
+ #include <asm/ptrace.h>
++      GEN_BR_THUNK %r1
++      GEN_BR_THUNK %r14
++
+       .section .kprobes.text, "ax"
+ ENTRY(ftrace_stub)
+-      br      %r14
++      BR_EX   %r14
+ #define STACK_FRAME_SIZE  (STACK_FRAME_OVERHEAD + __PT_SIZE)
+ #define STACK_PTREGS    (STACK_FRAME_OVERHEAD)
+@@ -21,7 +25,7 @@ ENTRY(ftrace_stub)
+ #define STACK_PTREGS_PSW  (STACK_PTREGS + __PT_PSW)
+ ENTRY(_mcount)
+-      br      %r14
++      BR_EX   %r14
+ ENTRY(ftrace_caller)
+       .globl  ftrace_regs_caller
+@@ -49,7 +53,7 @@ ENTRY(ftrace_caller)
+ #endif
+       lgr     %r3,%r14
+       la      %r5,STACK_PTREGS(%r15)
+-      basr    %r14,%r1
++      BASR_EX %r14,%r1
+ #ifdef CONFIG_FUNCTION_GRAPH_TRACER
+ # The j instruction gets runtime patched to a nop instruction.
+ # See ftrace_enable_ftrace_graph_caller.
+@@ -64,7 +68,7 @@ ftrace_graph_caller_end:
+ #endif
+       lg      %r1,(STACK_PTREGS_PSW+8)(%r15)
+       lmg     %r2,%r15,(STACK_PTREGS_GPRS+2*8)(%r15)
+-      br      %r1
++      BR_EX   %r1
+ #ifdef CONFIG_FUNCTION_GRAPH_TRACER
+@@ -77,6 +81,6 @@ ENTRY(return_to_handler)
+       aghi    %r15,STACK_FRAME_OVERHEAD
+       lgr     %r14,%r2
+       lmg     %r2,%r5,32(%r15)
+-      br      %r14
++      BR_EX   %r14
+ #endif
index be57ed17e813848666dfdfa1d39f47a390a58336..71a54186026179cbcdf0db2c6a4b43fe152503d7 100644 (file)
@@ -266,3 +266,4 @@ regulator-of-add-a-missing-of_node_put-in-an-error-handling-path-of-of_regulator
 asoc-samsung-i2s-ensure-the-rclk-rate-is-properly-determined.patch
 bluetooth-btusb-add-device-id-for-rtl8822be.patch
 kdb-make-mdr-command-repeat.patch
+s390-ftrace-use-expoline-for-indirect-branches.patch