Re: [PATCH] selftests/powerpc: Fix exec_prot test failure on Hash MMU

From: Chris Chiu

Date: Mon Sep 14 2026 - 20:04:25 EST


On Wed, Sep 9, 2026 at 1:09 PM Chris Chiu <chris.chiu@xxxxxxxxxxxxx> wrote:
>
> Hash MMU maps execute-only pages as readable at the PTE level, so reading
> from a PROT_EXEC-only mapping does not fault there. The exec_prot test
> currently treats that as a failure, while the rest of the permission
> checks are still valid.
>
> Use the existing using_hash_mmu() helper and skip only the read-on-
> execute-only subtest on Hash MMU. Keep the rest of the test unchanged so
> the fix stays local to the unsupported execute-only-read expectation.
>
> Signed-off-by: Chris Chiu <chris.chiu@xxxxxxxxxxxxx>
> ---
> .../testing/selftests/powerpc/mm/exec_prot.c | 21 ++++++++++++-------
> 1 file changed, 14 insertions(+), 7 deletions(-)
>
> diff --git a/tools/testing/selftests/powerpc/mm/exec_prot.c b/tools/testing/selftests/powerpc/mm/exec_prot.c
> index db75b2225de1..bd44f49d8449 100644
> --- a/tools/testing/selftests/powerpc/mm/exec_prot.c
> +++ b/tools/testing/selftests/powerpc/mm/exec_prot.c
> @@ -108,11 +108,14 @@ static int check_exec_fault(int rights)
> static int test(void)
> {
> struct sigaction segv_act, trap_act;
> + bool hash_mmu;
> int i;
>
> /* Skip the test if the CPU doesn't support Radix */
> SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_00));
>
> + FAIL_IF(using_hash_mmu(&hash_mmu));
> +
> /* Check if pkeys are supported */
> pkeys_supported = pkeys_unsupported() == 0;
>
> @@ -167,13 +170,17 @@ static int test(void)
> * Read an instruction word from the address when the page
> * is execute only. This should generate an access fault.
> */
> - fault_code = -1;
> - remaining_faults = 1;
> - printf("Testing read on --x, should fault...");
> - FAIL_IF(mprotect(insns, pgsize, PROT_EXEC) != 0);
> - i = *fault_addr;
> - FAIL_IF(remaining_faults != 0 || !is_fault_expected(fault_code));
> - printf("ok!\n");
> + if (!hash_mmu) {
> + fault_code = -1;
> + remaining_faults = 1;
> + printf("Testing read on --x, should fault...");
> + FAIL_IF(mprotect(insns, pgsize, PROT_EXEC) != 0);
> + i = *fault_addr;
> + FAIL_IF(remaining_faults != 0 || !is_fault_expected(fault_code));
> + printf("ok!\n");
> + } else {
> + printf("Testing read on --x, skipped on Hash MMU\n");
> + }
>
> /*
> * Write an instruction word to the address when the page
> --
> 2.43.0
>

Gentle ping.