diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-04-23 08:31:36 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2018-05-07 03:07:36 -0400 |
commit | 97489e0663fa700d6e7febddc43b58df98d7bcda (patch) | |
tree | e535bed69218ceec539b4e28a5e6058e5ff24c35 | |
parent | 467a3bf219cee12259182c5cb4821f88fd518a51 (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.S | 19 |
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) |
46 | EXPORT_SYMBOL(memmove) | 49 | EXPORT_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 |