• Mark Rutland's avatar
    arm64: mm: fix spurious fault detection · 308c5156
    Mark Rutland authored
    When detecting a spurious EL1 translation fault, we attempt to compare
    ESR_EL1.DFSC with PAR_EL1.FST. We erroneously use FIELD_PREP() to
    extract PAR_EL1.FST, when we should be using FIELD_GET().
    
    In the wise words of Robin Murphy:
    
    | FIELD_GET() is a UBFX, FIELD_PREP() is a BFI
    
    Using FIELD_PREP() means that that dfsc & ESR_ELx_FSC_TYPE is always
    zero, and hence not equal to ESR_ELx_FSC_FAULT. Thus we detect any
    unhandled translation fault as spurious.
    
    ... so let's use FIELD_GET() to ensure we don't decide all translation
    faults are spurious. ESR_EL1.DFSC occupies bits [5:0], and requires no
    shifting.
    
    Fixes: 42f91093 ("arm64: mm: Ignore spurious translation faults taken from the kernel")
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Reported-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Will Deacon <will.deacon@kernel.org>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    308c5156
fault.c 26.2 KB