lkml.org 
[lkml]   [2018]   [May]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 80/92] s390/kernel: use expoline for indirect branches
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Martin Schwidefsky <schwidefsky@de.ibm.com>

    [ Upstream commit c50c84c3ac4d5db683904bdb3257798b6ef980ae ]

    The assember code in arch/s390/kernel uses a few more indirect branches
    which need to be done with 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>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/s390/kernel/base.S | 24 ++++++++++++++----------
    arch/s390/kernel/reipl.S | 5 ++++-
    arch/s390/kernel/swsusp.S | 10 ++++++----
    3 files changed, 24 insertions(+), 15 deletions(-)

    --- a/arch/s390/kernel/base.S
    +++ b/arch/s390/kernel/base.S
    @@ -8,18 +8,22 @@

    #include <linux/linkage.h>
    #include <asm/asm-offsets.h>
    +#include <asm/nospec-insn.h>
    #include <asm/ptrace.h>
    #include <asm/sigp.h>

    + GEN_BR_THUNK %r9
    + GEN_BR_THUNK %r14
    +
    ENTRY(s390_base_mcck_handler)
    basr %r13,0
    0: lg %r15,__LC_PANIC_STACK # load panic stack
    aghi %r15,-STACK_FRAME_OVERHEAD
    larl %r1,s390_base_mcck_handler_fn
    - lg %r1,0(%r1)
    - ltgr %r1,%r1
    + lg %r9,0(%r1)
    + ltgr %r9,%r9
    jz 1f
    - basr %r14,%r1
    + BASR_EX %r14,%r9
    1: la %r1,4095
    lmg %r0,%r15,__LC_GPREGS_SAVE_AREA-4095(%r1)
    lpswe __LC_MCK_OLD_PSW
    @@ -36,10 +40,10 @@ ENTRY(s390_base_ext_handler)
    basr %r13,0
    0: aghi %r15,-STACK_FRAME_OVERHEAD
    larl %r1,s390_base_ext_handler_fn
    - lg %r1,0(%r1)
    - ltgr %r1,%r1
    + lg %r9,0(%r1)
    + ltgr %r9,%r9
    jz 1f
    - basr %r14,%r1
    + BASR_EX %r14,%r9
    1: lmg %r0,%r15,__LC_SAVE_AREA_ASYNC
    ni __LC_EXT_OLD_PSW+1,0xfd # clear wait state bit
    lpswe __LC_EXT_OLD_PSW
    @@ -56,10 +60,10 @@ ENTRY(s390_base_pgm_handler)
    basr %r13,0
    0: aghi %r15,-STACK_FRAME_OVERHEAD
    larl %r1,s390_base_pgm_handler_fn
    - lg %r1,0(%r1)
    - ltgr %r1,%r1
    + lg %r9,0(%r1)
    + ltgr %r9,%r9
    jz 1f
    - basr %r14,%r1
    + BASR_EX %r14,%r9
    lmg %r0,%r15,__LC_SAVE_AREA_SYNC
    lpswe __LC_PGM_OLD_PSW
    1: lpswe disabled_wait_psw-0b(%r13)
    @@ -116,7 +120,7 @@ ENTRY(diag308_reset)
    larl %r4,.Lcontinue_psw # Restore PSW flags
    lpswe 0(%r4)
    .Lcontinue:
    - br %r14
    + BR_EX %r14
    .align 16
    .Lrestart_psw:
    .long 0x00080000,0x80000000 + .Lrestart_part2
    --- a/arch/s390/kernel/reipl.S
    +++ b/arch/s390/kernel/reipl.S
    @@ -6,8 +6,11 @@

    #include <linux/linkage.h>
    #include <asm/asm-offsets.h>
    +#include <asm/nospec-insn.h>
    #include <asm/sigp.h>

    + GEN_BR_THUNK %r14
    +
    #
    # store_status
    #
    @@ -62,7 +65,7 @@ ENTRY(store_status)
    st %r3,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 4(%r1)
    larl %r2,store_status
    stg %r2,__LC_PSW_SAVE_AREA-SAVE_AREA_BASE + 8(%r1)
    - br %r14
    + BR_EX %r14

    .section .bss
    .align 8
    --- a/arch/s390/kernel/swsusp.S
    +++ b/arch/s390/kernel/swsusp.S
    @@ -12,6 +12,7 @@
    #include <asm/ptrace.h>
    #include <asm/thread_info.h>
    #include <asm/asm-offsets.h>
    +#include <asm/nospec-insn.h>
    #include <asm/sigp.h>

    /*
    @@ -23,6 +24,8 @@
    * (see below) in the resume process.
    * This function runs with disabled interrupts.
    */
    + GEN_BR_THUNK %r14
    +
    .section .text
    ENTRY(swsusp_arch_suspend)
    stmg %r6,%r15,__SF_GPRS(%r15)
    @@ -102,7 +105,7 @@ ENTRY(swsusp_arch_suspend)
    spx 0x318(%r1)
    lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15)
    lghi %r2,0
    - br %r14
    + BR_EX %r14

    /*
    * Restore saved memory image to correct place and restore register context.
    @@ -196,11 +199,10 @@ pgm_check_entry:
    larl %r15,init_thread_union
    ahi %r15,1<<(PAGE_SHIFT+THREAD_ORDER)
    larl %r2,.Lpanic_string
    - larl %r3,_sclp_print_early
    lghi %r1,0
    sam31
    sigp %r1,%r0,SIGP_SET_ARCHITECTURE
    - basr %r14,%r3
    + brasl %r14,_sclp_print_early
    larl %r3,.Ldisabled_wait_31
    lpsw 0(%r3)
    4:
    @@ -266,7 +268,7 @@ restore_registers:
    /* Return 0 */
    lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15)
    lghi %r2,0
    - br %r14
    + BR_EX %r14

    .section .data..nosave,"aw",@progbits
    .align 8

    \
     
     \ /
      Last update: 2018-05-24 13:53    [W:8.515 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site