]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
s390/nospec: generate single register thunks if possible
authorVasily Gorbik <gor@linux.ibm.com>
Mon, 28 Feb 2022 12:15:59 +0000 (13:15 +0100)
committerVasily Gorbik <gor@linux.ibm.com>
Thu, 10 Mar 2022 14:58:17 +0000 (15:58 +0100)
Currently assembler generated expoline thunks are always in a form
__s390_indirect_jump_rXuse_rX even when exrl instruction is available
and no additional register is utilized.

Generate __s390_indirect_jump_rX versions using a single register if the
kernel is built for z10 or newer machine, which have exrl instruction
available. Thunks generated are identical to the ones generated by the
compiler.

This helps to reduce the number of thunks for newer machines generations.

Acked-by: Sumanth Korikkar <sumanthk@linux.ibm.com>
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
arch/s390/include/asm/nospec-insn.h

index c419c9e87265d2b66b3b0225314bd4c99d4a26ea..4397eae15e3423eaa2834ad03ba625abb9c3d9b4 100644 (file)
@@ -31,6 +31,19 @@ _LC_BR_R1 = __LC_BR_R1
        .popsection
        .endm
 
+#ifdef CONFIG_HAVE_MARCH_Z10_FEATURES
+       .macro __THUNK_PROLOG_BR r1,r2
+       __THUNK_PROLOG_NAME __s390_indirect_jump_r\r1
+       .endm
+
+       .macro __THUNK_BR r1,r2
+       jg      __s390_indirect_jump_r\r1
+       .endm
+
+       .macro __THUNK_BRASL r1,r2,r3
+       brasl   \r1,__s390_indirect_jump_r\r2
+       .endm
+#else
        .macro __THUNK_PROLOG_BR r1,r2
        __THUNK_PROLOG_NAME __s390_indirect_jump_r\r2\()use_r\r1
        .endm
@@ -42,6 +55,7 @@ _LC_BR_R1 = __LC_BR_R1
        .macro __THUNK_BRASL r1,r2,r3
        brasl   \r1,__s390_indirect_jump_r\r3\()use_r\r2
        .endm
+#endif
 
        .macro  __DECODE_RR expand,reg,ruse
        .set __decode_fail,1