lkml.org 
[lkml]   [2020]   [Apr]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v13 11/12] arm64: scs: add shadow stacks for SDEI
    From
    This change adds per-CPU shadow call stacks for the SDEI handler.
    Similarly to how the kernel stacks are handled, we add separate shadow
    stacks for normal and critical events.

    Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
    Reviewed-by: James Morse <james.morse@arm.com>
    Tested-by: James Morse <james.morse@arm.com>
    ---
    arch/arm64/kernel/entry.S | 14 +++++++++++++-
    arch/arm64/kernel/scs.c | 5 +++++
    2 files changed, 18 insertions(+), 1 deletion(-)

    diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
    index 244268d5ae47..cb0516e6f963 100644
    --- a/arch/arm64/kernel/entry.S
    +++ b/arch/arm64/kernel/entry.S
    @@ -1049,13 +1049,16 @@ SYM_CODE_START(__sdei_asm_handler)

    mov x19, x1

    +#if defined(CONFIG_VMAP_STACK) || defined(CONFIG_SHADOW_CALL_STACK)
    + ldrb w4, [x19, #SDEI_EVENT_PRIORITY]
    +#endif
    +
    #ifdef CONFIG_VMAP_STACK
    /*
    * entry.S may have been using sp as a scratch register, find whether
    * this is a normal or critical event and switch to the appropriate
    * stack for this CPU.
    */
    - ldrb w4, [x19, #SDEI_EVENT_PRIORITY]
    cbnz w4, 1f
    ldr_this_cpu dst=x5, sym=sdei_stack_normal_ptr, tmp=x6
    b 2f
    @@ -1065,6 +1068,15 @@ SYM_CODE_START(__sdei_asm_handler)
    mov sp, x5
    #endif

    +#ifdef CONFIG_SHADOW_CALL_STACK
    + /* Use a separate shadow call stack for normal and critical events */
    + cbnz w4, 3f
    + adr_this_cpu dst=x18, sym=sdei_shadow_call_stack_normal, tmp=x6
    + b 4f
    +3: adr_this_cpu dst=x18, sym=sdei_shadow_call_stack_critical, tmp=x6
    +4:
    +#endif
    +
    /*
    * We may have interrupted userspace, or a guest, or exit-from or
    * return-to either of these. We can't trust sp_el0, restore it.
    diff --git a/arch/arm64/kernel/scs.c b/arch/arm64/kernel/scs.c
    index acc6741d1a40..adc97f826fab 100644
    --- a/arch/arm64/kernel/scs.c
    +++ b/arch/arm64/kernel/scs.c
    @@ -13,3 +13,8 @@
    DEFINE_PER_CPU(unsigned long [SCS_SIZE/sizeof(long)], name) \

    DEFINE_SCS(irq_shadow_call_stack);
    +
    +#ifdef CONFIG_ARM_SDE_INTERFACE
    +DEFINE_SCS(sdei_shadow_call_stack_normal);
    +DEFINE_SCS(sdei_shadow_call_stack_critical);
    +#endif
    --
    2.26.2.303.gf8c07b1a785-goog
    \
     
     \ /
      Last update: 2020-04-27 18:01    [W:2.371 / U:7.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site