Commit 956573ac authored by Mark Brown's avatar Mark Brown Committed by Catalin Marinas
Browse files

kselftest/arm64: Allow signals tests to specify an expected si_code



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.

Reviewed-by: default avatarThiago Jung Bauermann <thiago.bauermann@linaro.org>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20241001-arm64-gcs-v13-32-222b78d87eee@kernel.org


Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 0d426f7d
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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 */
+19 −10
Original line number Diff line number Diff line
@@ -143,17 +143,26 @@ static bool handle_signal_ok(struct tdescr *td,
			"current->token ZEROED...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.
		 * 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;
	/*
	 * Some tests can lead to SEGV loops: in such a case we want to