Skip to content
  • Mark Rutland's avatar
    f7c706f0
    arm64: entry: unmask IRQ+FIQ after EL0 handling · f7c706f0
    Mark Rutland authored
    
    
    For non-fatal exceptions taken from EL0, we expect that at some point
    during exception handling it is possible to return to a regular process
    context with all exceptions unmasked (e.g. as we do in
    do_notify_resume()), and we generally aim to unmask exceptions wherever
    possible.
    
    While handling SError and debug exceptions from EL0, we need to leave
    some exceptions masked during handling. Handling SError requires us to
    mask SError (which also requires masking IRQ+FIQ), and handing debug
    exceptions requires us to mask debug (which also requires masking
    SError+IRQ+FIQ).
    
    Once do_serror() or do_debug_exception() has returned, we no longer need
    to mask exceptions, and can unmask them all, which is what we did prior
    to commit:
    
      9034f625 ("arm64: Do not enable IRQs for ct_user_exit")
    
    ... where we had to mask IRQs as for context_tracking_user_exit()
    expected IRQs to be masked.
    
    Since then, we realised that our context tracking wasn't entirely
    correct, and reworked the entry code to fix this. As of commit:
    
      23529049 ("arm64: entry: fix non-NMI user<->kernel transitions")
    
    ... we replaced the call to context_tracking_user_exit() with a call to
    user_exit_irqoff() as part of enter_from_user_mode(), which occurs
    earlier, before we run the body of the handler and unmask exceptions in
    DAIF.
    
    When we return to userspace, we go via ret_to_user(), which masks
    exceptions in DAIF prior to calling user_enter_irqoff() as part of
    exit_to_user_mode().
    
    Thus, there's no longer a reason to leave IRQs or FIQs masked at the end
    of the EL0 debug or error handlers, as neither the user exit context
    tracking nor the user entry context tracking requires this. Let's bring
    these into line with other EL0 exception handlers and ensure that IRQ
    and FIQ are unmasked in DAIF at some point during the handler.
    
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    Reviewed-by: default avatarJoey Gouly <joey.gouly@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20210607094624.34689-3-mark.rutland@arm.com
    
    
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    f7c706f0
    arm64: entry: unmask IRQ+FIQ after EL0 handling
    Mark Rutland authored
    
    
    For non-fatal exceptions taken from EL0, we expect that at some point
    during exception handling it is possible to return to a regular process
    context with all exceptions unmasked (e.g. as we do in
    do_notify_resume()), and we generally aim to unmask exceptions wherever
    possible.
    
    While handling SError and debug exceptions from EL0, we need to leave
    some exceptions masked during handling. Handling SError requires us to
    mask SError (which also requires masking IRQ+FIQ), and handing debug
    exceptions requires us to mask debug (which also requires masking
    SError+IRQ+FIQ).
    
    Once do_serror() or do_debug_exception() has returned, we no longer need
    to mask exceptions, and can unmask them all, which is what we did prior
    to commit:
    
      9034f625 ("arm64: Do not enable IRQs for ct_user_exit")
    
    ... where we had to mask IRQs as for context_tracking_user_exit()
    expected IRQs to be masked.
    
    Since then, we realised that our context tracking wasn't entirely
    correct, and reworked the entry code to fix this. As of commit:
    
      23529049 ("arm64: entry: fix non-NMI user<->kernel transitions")
    
    ... we replaced the call to context_tracking_user_exit() with a call to
    user_exit_irqoff() as part of enter_from_user_mode(), which occurs
    earlier, before we run the body of the handler and unmask exceptions in
    DAIF.
    
    When we return to userspace, we go via ret_to_user(), which masks
    exceptions in DAIF prior to calling user_enter_irqoff() as part of
    exit_to_user_mode().
    
    Thus, there's no longer a reason to leave IRQs or FIQs masked at the end
    of the EL0 debug or error handlers, as neither the user exit context
    tracking nor the user entry context tracking requires this. Let's bring
    these into line with other EL0 exception handlers and ensure that IRQ
    and FIQ are unmasked in DAIF at some point during the handler.
    
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Acked-by: default avatarMarc Zyngier <maz@kernel.org>
    Reviewed-by: default avatarJoey Gouly <joey.gouly@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will@kernel.org>
    Link: https://lore.kernel.org/r/20210607094624.34689-3-mark.rutland@arm.com
    
    
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
Loading