arm64: mm: fix spurious fault detection
authorMark Rutland <mark.rutland@arm.com>
Fri, 4 Oct 2019 13:58:47 +0000 (14:58 +0100)
committerWill Deacon <will@kernel.org>
Mon, 7 Oct 2019 10:07:16 +0000 (11:07 +0100)
commit308c51561720547a90767a2f367f5390052c51da
treec5e7be82f4129fe1a8893e903fa3605f6bff5978
parentdd8a1f13488438c6c220b7cafa500baaf21a6e53
arm64: mm: fix spurious fault detection

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: 42f91093b043332a ("arm64: mm: Ignore spurious translation faults taken from the kernel")
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Reported-by: Robin 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: Will Deacon <will@kernel.org>
arch/arm64/mm/fault.c