• James Morse's avatar
    arm64: Mask all exceptions during kernel_exit · 8d66772e
    James Morse authored
    To take RAS Exceptions as quickly as possible we need to keep SError
    unmasked as much as possible. We need to mask it during kernel_exit
    as taking an error from this code will overwrite the exception-registers.
    
    Adding a naked 'disable_daif' to kernel_exit causes a performance problem
    for micro-benchmarks that do no real work, (e.g. calling getpid() in a
    loop). This is because the ret_to_user loop has already masked IRQs so
    that the TIF_WORK_MASK thread flags can't change underneath it, adding
    disable_daif is an additional self-synchronising operation.
    
    In the future, the RAS APEI code may need to modify the TIF_WORK_MASK
    flags from an SError, in which case the ret_to_user loop must mask SError
    while it examines the flags.
    
    Disable all exceptions for return to EL1. For return to EL0 get the
    ret_to_user loop to leave all exceptions masked once it has done its
    work, this avoids an extra pstate-write.
    Signed-off-by: default avatarJames Morse <james.morse@arm.com>
    Reviewed-by: default avatarJulien Thierry <julien.thierry@arm.com>
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    8d66772e
signal.c 19.3 KB