]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests/x86: Update the negative vsyscall tests to expect a #GP
authorSohil Mehta <sohil.mehta@intel.com>
Tue, 18 Nov 2025 18:29:09 +0000 (10:29 -0800)
committerDave Hansen <dave.hansen@linux.intel.com>
Tue, 18 Nov 2025 18:38:26 +0000 (10:38 -0800)
Some of the vsyscall selftests expect a #PF when vsyscalls are disabled.
However, with LASS enabled, an invalid access results in a SIGSEGV due
to a #GP instead of a #PF. One such negative test fails because it is
expecting X86_PF_INSTR to be set.

Update the failing test to expect either a #GP or a #PF. Also, update
the printed messages to show the trap number (denoting the type of
fault) instead of assuming a #PF.

Signed-off-by: Sohil Mehta <sohil.mehta@intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Dave Hansen <dave.hansen@linux.intel.com>
Link: https://patch.msgid.link/20251118182911.2983253-8-sohil.mehta%40intel.com
tools/testing/selftests/x86/test_vsyscall.c

index 05e1e6774fba322015b05dcdb0731fd8f3805e56..918eaec8bfbe1ced7005e44501ee6cdc4277f5a2 100644 (file)
@@ -308,12 +308,13 @@ static void test_getcpu(int cpu)
 #ifdef __x86_64__
 
 static jmp_buf jmpbuf;
-static volatile unsigned long segv_err;
+static volatile unsigned long segv_err, segv_trapno;
 
 static void sigsegv(int sig, siginfo_t *info, void *ctx_void)
 {
        ucontext_t *ctx = (ucontext_t *)ctx_void;
 
+       segv_trapno = ctx->uc_mcontext.gregs[REG_TRAPNO];
        segv_err =  ctx->uc_mcontext.gregs[REG_ERR];
        siglongjmp(jmpbuf, 1);
 }
@@ -336,7 +337,8 @@ static void test_vsys_r(void)
        else if (can_read)
                ksft_test_result_pass("We have read access\n");
        else
-               ksft_test_result_pass("We do not have read access: #PF(0x%lx)\n", segv_err);
+               ksft_test_result_pass("We do not have read access (trap=%ld, error=0x%lx)\n",
+                                     segv_trapno, segv_err);
 }
 
 static void test_vsys_x(void)
@@ -347,7 +349,7 @@ static void test_vsys_x(void)
                return;
        }
 
-       ksft_print_msg("Make sure that vsyscalls really page fault\n");
+       ksft_print_msg("Make sure that vsyscalls really cause a fault\n");
 
        bool can_exec;
        if (sigsetjmp(jmpbuf, 1) == 0) {
@@ -358,13 +360,14 @@ static void test_vsys_x(void)
        }
 
        if (can_exec)
-               ksft_test_result_fail("Executing the vsyscall did not page fault\n");
-       else if (segv_err & (1 << 4)) /* INSTR */
-               ksft_test_result_pass("Executing the vsyscall page failed: #PF(0x%lx)\n",
-                                     segv_err);
+               ksft_test_result_fail("Executing the vsyscall did not fault\n");
+       /* #GP or #PF (with X86_PF_INSTR) */
+       else if ((segv_trapno == 13) || ((segv_trapno == 14) && (segv_err & (1 << 4))))
+               ksft_test_result_pass("Executing the vsyscall page failed (trap=%ld, error=0x%lx)\n",
+                                     segv_trapno, segv_err);
        else
-               ksft_test_result_fail("Execution failed with the wrong error: #PF(0x%lx)\n",
-                                     segv_err);
+               ksft_test_result_fail("Execution failed with the wrong error (trap=%ld, error=0x%lx)\n",
+                                     segv_trapno, segv_err);
 }
 
 /*