aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwidefsky <schwidefsky@de.ibm.com>2018-04-23 08:31:36 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2018-05-07 03:07:36 -0400
commit97489e0663fa700d6e7febddc43b58df98d7bcda (patch)
treee535bed69218ceec539b4e28a5e6058e5ff24c35
parent467a3bf219cee12259182c5cb4821f88fd518a51 (diff)
s390/lib: use expoline for indirect branches
The return from the memmove, memset, memcpy, __memset16, __memset32 and __memset64 functions are done with "br %r14". These are indirect branches as well and need to use execute trampolines for CONFIG_EXPOLINE=y. Cc: stable@vger.kernel.org # 4.16 Fixes: f19fbd5ed6 ("s390: introduce execute-trampolines for branches") Reviewed-by: Hendrik Brueckner <brueckner@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-rw-r--r--arch/s390/lib/mem.S19
1 files changed, 11 insertions, 8 deletions
diff --git a/arch/s390/lib/mem.S b/arch/s390/lib/mem.S
index 495c9c4bacc7..2311f15be9cf 100644
--- a/arch/s390/lib/mem.S
+++ b/arch/s390/lib/mem.S
@@ -7,6 +7,9 @@
7 7
8#include <linux/linkage.h> 8#include <linux/linkage.h>
9#include <asm/export.h> 9#include <asm/export.h>
10#include <asm/nospec-insn.h>
11
12 GEN_BR_THUNK %r14
10 13
11/* 14/*
12 * void *memmove(void *dest, const void *src, size_t n) 15 * void *memmove(void *dest, const void *src, size_t n)
@@ -33,14 +36,14 @@ ENTRY(memmove)
33.Lmemmove_forward_remainder: 36.Lmemmove_forward_remainder:
34 larl %r5,.Lmemmove_mvc 37 larl %r5,.Lmemmove_mvc
35 ex %r4,0(%r5) 38 ex %r4,0(%r5)
36 br %r14 39 BR_EX %r14
37.Lmemmove_reverse: 40.Lmemmove_reverse:
38 ic %r0,0(%r4,%r3) 41 ic %r0,0(%r4,%r3)
39 stc %r0,0(%r4,%r1) 42 stc %r0,0(%r4,%r1)
40 brctg %r4,.Lmemmove_reverse 43 brctg %r4,.Lmemmove_reverse
41 ic %r0,0(%r4,%r3) 44 ic %r0,0(%r4,%r3)
42 stc %r0,0(%r4,%r1) 45 stc %r0,0(%r4,%r1)
43 br %r14 46 BR_EX %r14
44.Lmemmove_mvc: 47.Lmemmove_mvc:
45 mvc 0(1,%r1),0(%r3) 48 mvc 0(1,%r1),0(%r3)
46EXPORT_SYMBOL(memmove) 49EXPORT_SYMBOL(memmove)
@@ -77,7 +80,7 @@ ENTRY(memset)
77.Lmemset_clear_remainder: 80.Lmemset_clear_remainder:
78 larl %r3,.Lmemset_xc 81 larl %r3,.Lmemset_xc
79 ex %r4,0(%r3) 82 ex %r4,0(%r3)
80 br %r14 83 BR_EX %r14
81.Lmemset_fill: 84.Lmemset_fill:
82 cghi %r4,1 85 cghi %r4,1
83 lgr %r1,%r2 86 lgr %r1,%r2
@@ -95,10 +98,10 @@ ENTRY(memset)
95 stc %r3,0(%r1) 98 stc %r3,0(%r1)
96 larl %r5,.Lmemset_mvc 99 larl %r5,.Lmemset_mvc
97 ex %r4,0(%r5) 100 ex %r4,0(%r5)
98 br %r14 101 BR_EX %r14
99.Lmemset_fill_exit: 102.Lmemset_fill_exit:
100 stc %r3,0(%r1) 103 stc %r3,0(%r1)
101 br %r14 104 BR_EX %r14
102.Lmemset_xc: 105.Lmemset_xc:
103 xc 0(1,%r1),0(%r1) 106 xc 0(1,%r1),0(%r1)
104.Lmemset_mvc: 107.Lmemset_mvc:
@@ -121,7 +124,7 @@ ENTRY(memcpy)
121.Lmemcpy_remainder: 124.Lmemcpy_remainder:
122 larl %r5,.Lmemcpy_mvc 125 larl %r5,.Lmemcpy_mvc
123 ex %r4,0(%r5) 126 ex %r4,0(%r5)
124 br %r14 127 BR_EX %r14
125.Lmemcpy_loop: 128.Lmemcpy_loop:
126 mvc 0(256,%r1),0(%r3) 129 mvc 0(256,%r1),0(%r3)
127 la %r1,256(%r1) 130 la %r1,256(%r1)
@@ -159,10 +162,10 @@ ENTRY(__memset\bits)
159 \insn %r3,0(%r1) 162 \insn %r3,0(%r1)
160 larl %r5,.L__memset_mvc\bits 163 larl %r5,.L__memset_mvc\bits
161 ex %r4,0(%r5) 164 ex %r4,0(%r5)
162 br %r14 165 BR_EX %r14
163.L__memset_exit\bits: 166.L__memset_exit\bits:
164 \insn %r3,0(%r2) 167 \insn %r3,0(%r2)
165 br %r14 168 BR_EX %r14
166.L__memset_mvc\bits: 169.L__memset_mvc\bits:
167 mvc \bytes(1,%r1),0(%r1) 170 mvc \bytes(1,%r1),0(%r1)
168.endm 171.endm