• Michael Ellerman's avatar
    powerpc/mm: Detect bad KUAP faults · 5e5be3ae
    Michael Ellerman authored
    When KUAP is enabled we have logic to detect page faults that occur
    outside of a valid user access region and are blocked by the AMR.
    
    What we don't have at the moment is logic to detect a fault *within* a
    valid user access region, that has been incorrectly blocked by AMR.
    This is not meant to ever happen, but it can if we incorrectly
    save/restore the AMR, or if the AMR was overwritten for some other
    reason.
    
    Currently if that happens we assume it's just a regular fault that
    will be corrected by handling the fault normally, so we just return.
    But there is nothing the fault handling code can do to fix it, so the
    fault just happens again and we spin forever, leading to soft lockups.
    
    So add some logic to detect that case and WARN() if we ever see it.
    Arguably it should be a BUG(), but it's more polite to fail the access
    and let the kernel continue, rather than taking down the box. There
    should be no data integrity issue with failing the fault rather than
    BUG'ing, as we're just going to disallow an access that should have
    been allowed.
    
    To make the code a little easier to follow, unroll the condition at
    the end of bad_kernel_fault() and comment each case, before adding the
    call to bad_kuap_fault().
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    5e5be3ae
fault.c 20.2 KB