On Tue, Sep 03, 2024 at 03:50:46PM +0100, Joey Gouly wrote:
On Thu, Aug 29, 2024 at 06:55:07PM +0100, Mark Brown wrote:
On Thu, Aug 22, 2024 at 04:10:59PM +0100, Joey Gouly wrote:
+static bool fault_from_pkey(unsigned long esr, struct vm_area_struct *vma,
unsigned int mm_flags)
+{
- unsigned long iss2 = ESR_ELx_ISS2(esr);
- if (!system_supports_poe())
return false;
- if (iss2 & ESR_ELx_Overlay)
return true;
Does this need an is_data_abort() && is_instruction_abort() check? Overlay doesn't appear to be defined for all exception types and it wasn't clear enough to me that the callers have done this check.
The only callers are in do_page_fault(), which should only be data or instruction aborts. I talked with Catalin and he said it's fine to not check again here.
I can add a permissions check though:
commit 033270f5a9462e998b4dee11fc91b43ac7929756 Author: Joey Gouly joey.gouly@arm.com Date: Tue Sep 3 15:45:59 2024 +0100
fixup! arm64: handle PKEY/POE faults
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index a68055150950..f651553a8ab8 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -495,6 +495,9 @@ static bool fault_from_pkey(unsigned long esr, struct vm_area_struct *vma, if (!system_supports_poe()) return false;
if (!esr_fsc_is_permission_fault(esr))
return false;
if (iss2 & ESR_ELx_Overlay) return true;
Since the ESR_EL1 documentation says: If a memory access generates a Data Abort for a Permission fault, then this field holds information about the fault.
Sorry, I was a bit too eager with that patch. The previous patch was bailing out before the vma-backed checks could take place.
It should be:
commit 7b67b149f2f492e907b27521c95639f4ea208221 (HEAD -> permission_overlay_v6) Author: Joey Gouly joey.gouly@arm.com Date: Tue Sep 3 15:45:59 2024 +0100
fixup! arm64: handle PKEY/POE faults
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index a68055150950..8b281cf308b3 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -495,7 +495,7 @@ static bool fault_from_pkey(unsigned long esr, struct vm_area_struct *vma, if (!system_supports_poe()) return false;
- if (iss2 & ESR_ELx_Overlay) + if (esr_fsc_is_permission_fault(esr) && (iss2 & ESR_ELx_Overlay)) return true;
return !arch_vma_access_permitted(vma,