Currently we ignore si_code unless the expected signal is a SIGSEGV, in
which case we enforce it being SEGV_ACCERR. Allow test cases to specify
exactly which si_code should be generated so we can validate this, and
test for other segfault codes.

Signed-off-by: Mark Brown <broo...@kernel.org>
---
 .../testing/selftests/arm64/signal/test_signals.h  |  4 +++
 .../selftests/arm64/signal/test_signals_utils.c    | 29 ++++++++++++++--------
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/tools/testing/selftests/arm64/signal/test_signals.h 
b/tools/testing/selftests/arm64/signal/test_signals.h
index 7ada43688c02..ee75a2c25ce7 100644
--- a/tools/testing/selftests/arm64/signal/test_signals.h
+++ b/tools/testing/selftests/arm64/signal/test_signals.h
@@ -71,6 +71,10 @@ struct tdescr {
         * Zero when no signal is expected on success
         */
        int                     sig_ok;
+       /*
+        * expected si_code for sig_ok, or 0 to not check
+        */
+       int                     sig_ok_code;
        /* signum expected on unsupported CPU features. */
        int                     sig_unsupp;
        /* a timeout in second for test completion */
diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c 
b/tools/testing/selftests/arm64/signal/test_signals_utils.c
index 89ef95c1af0e..63deca32b0df 100644
--- a/tools/testing/selftests/arm64/signal/test_signals_utils.c
+++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c
@@ -143,16 +143,25 @@ static bool handle_signal_ok(struct tdescr *td,
                        "current->token ZEROED...test is probably broken!\n");
                abort();
        }
-       /*
-        * Trying to narrow down the SEGV to the ones generated by Kernel itself
-        * via arm64_notify_segfault(). This is a best-effort check anyway, and
-        * the si_code check may need to change if this aspect of the kernel
-        * ABI changes.
-        */
-       if (td->sig_ok == SIGSEGV && si->si_code != SEGV_ACCERR) {
-               fprintf(stdout,
-                       "si_code != SEGV_ACCERR...test is probably broken!\n");
-               abort();
+       if (td->sig_ok_code) {
+               if (si->si_code != td->sig_ok_code) {
+                       fprintf(stdout, "si_code is %d not %d\n",
+                               si->si_code, td->sig_ok_code);
+                       abort();
+               }
+       } else {
+               /*
+                * Trying to narrow down the SEGV to the ones
+                * generated by Kernel itself via
+                * arm64_notify_segfault(). This is a best-effort
+                * check anyway, and the si_code check may need to
+                * change if this aspect of the kernel ABI changes.
+                */
+               if (td->sig_ok == SIGSEGV && si->si_code != SEGV_ACCERR) {
+                       fprintf(stdout,
+                               "si_code != SEGV_ACCERR...test is probably 
broken!\n");
+                       abort();
+               }
        }
        td->pass = 1;
        /*

-- 
2.30.2


Reply via email to