lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 041/453] arm64: syscall: exit userspace before unmasking exceptions
    Date
    From: Mark Rutland <mark.rutland@arm.com>

    [ Upstream commit ca1314d73eed493c49bb1932c60a8605530db2e4 ]

    In el0_svc_common() we unmask exceptions before we call user_exit(), and
    so there's a window where an IRQ or debug exception can be taken while
    RCU is not watching. In do_debug_exception() we account for this in via
    debug_exception_{enter,exit}(), but in the el1_irq asm we do not and we
    call trace functions which rely on RCU before we have a guarantee that
    RCU is watching.

    Let's avoid this by having el0_svc_common() exit userspace before
    unmasking exceptions, matching what we do for all other EL0 entry paths.
    We can use user_exit_irqoff() to avoid the pointless save/restore of IRQ
    flags while we're sure exceptions are masked in DAIF.

    The workaround for Cortex-A76 erratum 1463225 may trigger a debug
    exception before this point, but the debug code invoked in this case is
    safe even when RCU is not watching.

    Signed-off-by: Mark Rutland <mark.rutland@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20201130115950.22492-2-mark.rutland@arm.com
    Signed-off-by: Will Deacon <will@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm64/kernel/syscall.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/arm64/kernel/syscall.c b/arch/arm64/kernel/syscall.c
    index 1457a0ba83dbc..f2d2dbbbfca20 100644
    --- a/arch/arm64/kernel/syscall.c
    +++ b/arch/arm64/kernel/syscall.c
    @@ -102,8 +102,8 @@ static void el0_svc_common(struct pt_regs *regs, int scno, int sc_nr,
    regs->syscallno = scno;

    cortex_a76_erratum_1463225_svc_handler();
    + user_exit_irqoff();
    local_daif_restore(DAIF_PROCCTX);
    - user_exit();

    if (has_syscall_work(flags)) {
    /* set default errno for user-issued syscall(-1) */
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 16:51    [W:4.016 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site