• Mark Rutland's avatar
    arm64: syscall: exit userspace before unmasking exceptions · ca1314d7
    Mark Rutland authored
    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: default avatarMark 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.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    ca1314d7
syscall.c 5.76 KB