s390/lib: use expoline for all bcr instructions

The memove, memset, memcpy, __memset16, __memset32 and __memset64
function have an additional indirect return branch in form of a
"bzr" instruction. These need to use expolines as well.

Cc: <stable@vger.kernel.org> # v4.17+
Fixes: 97489e0663 ("s390/lib: use expoline for indirect branches")
Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Martin Schwidefsky 2018-08-06 13:49:47 +02:00
parent fb7d7518b0
commit 5eda25b102

View File

@ -17,7 +17,7 @@
ENTRY(memmove) ENTRY(memmove)
ltgr %r4,%r4 ltgr %r4,%r4
lgr %r1,%r2 lgr %r1,%r2
bzr %r14 jz .Lmemmove_exit
aghi %r4,-1 aghi %r4,-1
clgr %r2,%r3 clgr %r2,%r3
jnh .Lmemmove_forward jnh .Lmemmove_forward
@ -36,6 +36,7 @@ ENTRY(memmove)
.Lmemmove_forward_remainder: .Lmemmove_forward_remainder:
larl %r5,.Lmemmove_mvc larl %r5,.Lmemmove_mvc
ex %r4,0(%r5) ex %r4,0(%r5)
.Lmemmove_exit:
BR_EX %r14 BR_EX %r14
.Lmemmove_reverse: .Lmemmove_reverse:
ic %r0,0(%r4,%r3) ic %r0,0(%r4,%r3)
@ -65,7 +66,7 @@ EXPORT_SYMBOL(memmove)
*/ */
ENTRY(memset) ENTRY(memset)
ltgr %r4,%r4 ltgr %r4,%r4
bzr %r14 jz .Lmemset_exit
ltgr %r3,%r3 ltgr %r3,%r3
jnz .Lmemset_fill jnz .Lmemset_fill
aghi %r4,-1 aghi %r4,-1
@ -80,6 +81,7 @@ ENTRY(memset)
.Lmemset_clear_remainder: .Lmemset_clear_remainder:
larl %r3,.Lmemset_xc larl %r3,.Lmemset_xc
ex %r4,0(%r3) ex %r4,0(%r3)
.Lmemset_exit:
BR_EX %r14 BR_EX %r14
.Lmemset_fill: .Lmemset_fill:
cghi %r4,1 cghi %r4,1
@ -115,7 +117,7 @@ EXPORT_SYMBOL(memset)
*/ */
ENTRY(memcpy) ENTRY(memcpy)
ltgr %r4,%r4 ltgr %r4,%r4
bzr %r14 jz .Lmemcpy_exit
aghi %r4,-1 aghi %r4,-1
srlg %r5,%r4,8 srlg %r5,%r4,8
ltgr %r5,%r5 ltgr %r5,%r5
@ -124,6 +126,7 @@ ENTRY(memcpy)
.Lmemcpy_remainder: .Lmemcpy_remainder:
larl %r5,.Lmemcpy_mvc larl %r5,.Lmemcpy_mvc
ex %r4,0(%r5) ex %r4,0(%r5)
.Lmemcpy_exit:
BR_EX %r14 BR_EX %r14
.Lmemcpy_loop: .Lmemcpy_loop:
mvc 0(256,%r1),0(%r3) mvc 0(256,%r1),0(%r3)
@ -145,9 +148,9 @@ EXPORT_SYMBOL(memcpy)
.macro __MEMSET bits,bytes,insn .macro __MEMSET bits,bytes,insn
ENTRY(__memset\bits) ENTRY(__memset\bits)
ltgr %r4,%r4 ltgr %r4,%r4
bzr %r14 jz .L__memset_exit\bits
cghi %r4,\bytes cghi %r4,\bytes
je .L__memset_exit\bits je .L__memset_store\bits
aghi %r4,-(\bytes+1) aghi %r4,-(\bytes+1)
srlg %r5,%r4,8 srlg %r5,%r4,8
ltgr %r5,%r5 ltgr %r5,%r5
@ -163,8 +166,9 @@ ENTRY(__memset\bits)
larl %r5,.L__memset_mvc\bits larl %r5,.L__memset_mvc\bits
ex %r4,0(%r5) ex %r4,0(%r5)
BR_EX %r14 BR_EX %r14
.L__memset_exit\bits: .L__memset_store\bits:
\insn %r3,0(%r2) \insn %r3,0(%r2)
.L__memset_exit\bits:
BR_EX %r14 BR_EX %r14
.L__memset_mvc\bits: .L__memset_mvc\bits:
mvc \bytes(1,%r1),0(%r1) mvc \bytes(1,%r1),0(%r1)