• Mark Rutland's avatar
    arm64: Unmask Debug + SError in do_notify_resume() · 97d935fa
    Mark Rutland authored
    When returning to a user context, the arm64 entry code masks all DAIF
    exceptions before handling pending work in exit_to_user_mode_prepare()
    and do_notify_resume(), where it will transiently unmask all DAIF
    exceptions. This is a holdover from the old entry assembly, which
    conservatively masked all DAIF exceptions, and it's only necessary to
    mask interrupts at this point during the exception return path, so long
    as we subsequently mask all DAIF exceptions before the actual exception
    return.
    
    While most DAIF manipulation follows a save...restore sequence, the
    manipulation in do_notify_resume() is the other way around, unmasking
    all DAIF exceptions before masking them again. This is unfortunate as we
    unnecessarily mask Debug and SError exceptions, and it would be nice to
    remove this special case to make DAIF manipulation simpler and most
    consistent.
    
    This patch changes exit_to_user_mode_prepare() and do_notify_resume() to
    only mask interrupts while handling pending work, masking other DAIF
    exceptions after this has completed. This removes the unusual DAIF
    manipulation and allows Debug and SError exceptions to be taken for a
    slightly longer window during the exception return path.
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Will Deacon <will@kernel.org>
    Reviewed-by: default avatarMark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20240206123848.1696480-4-mark.rutland@arm.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Tested-by: default avatarItaru Kitayama <itaru.kitayama@linux.dev>
    97d935fa
entry-common.c 23.4 KB