[PATCH v3 3/9] selftests: arm, arm64: Use ifdeffery to pull signal infrastructure

Dev Jain dev.jain at arm.com
Tue Jun 25 05:24:02 PDT 2024


Use ifdeffery to guard code chunks meant specifically for arm64, in
preparation for putting signal tests in selftests/arm.

Signed-off-by: Dev Jain <dev.jain at arm.com>
---
 .../selftests/arm/signal/test_signals.c       |  2 +
 .../selftests/arm/signal/test_signals.h       |  2 +
 .../selftests/arm/signal/test_signals_utils.c |  2 +
 .../selftests/arm/signal/test_signals_utils.h |  2 +
 .../selftests/arm64/signal/test_signals.h     | 12 +++++
 .../arm64/signal/test_signals_utils.c         | 51 +++++++++++++++----
 .../arm64/signal/test_signals_utils.h         |  3 ++
 7 files changed, 65 insertions(+), 9 deletions(-)
 create mode 100644 tools/testing/selftests/arm/signal/test_signals.c
 create mode 100644 tools/testing/selftests/arm/signal/test_signals.h
 create mode 100644 tools/testing/selftests/arm/signal/test_signals_utils.c
 create mode 100644 tools/testing/selftests/arm/signal/test_signals_utils.h

diff --git a/tools/testing/selftests/arm/signal/test_signals.c b/tools/testing/selftests/arm/signal/test_signals.c
new file mode 100644
index 000000000000..6b47c26ee218
--- /dev/null
+++ b/tools/testing/selftests/arm/signal/test_signals.c
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals.c"
diff --git a/tools/testing/selftests/arm/signal/test_signals.h b/tools/testing/selftests/arm/signal/test_signals.h
new file mode 100644
index 000000000000..946913d29636
--- /dev/null
+++ b/tools/testing/selftests/arm/signal/test_signals.h
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals.h"
diff --git a/tools/testing/selftests/arm/signal/test_signals_utils.c b/tools/testing/selftests/arm/signal/test_signals_utils.c
new file mode 100644
index 000000000000..2b16d53545be
--- /dev/null
+++ b/tools/testing/selftests/arm/signal/test_signals_utils.c
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals_utils.c"
diff --git a/tools/testing/selftests/arm/signal/test_signals_utils.h b/tools/testing/selftests/arm/signal/test_signals_utils.h
new file mode 100644
index 000000000000..a4d61697a8dd
--- /dev/null
+++ b/tools/testing/selftests/arm/signal/test_signals_utils.h
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals_utils.h"
diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/testing/selftests/arm64/signal/test_signals.h
index 1e6273d81575..9c1bd6560501 100644
--- a/tools/testing/selftests/arm64/signal/test_signals.h
+++ b/tools/testing/selftests/arm64/signal/test_signals.h
@@ -14,6 +14,8 @@
 #include <asm/ptrace.h>
 #include <asm/hwcap.h>
 
+/* Not used by selftests/arm */
+#ifdef __aarch64__
 #define __stringify_1(x...)	#x
 #define __stringify(x...)	__stringify_1(x)
 
@@ -43,6 +45,7 @@ enum {
 #define FEAT_SME		(1UL << FSME_BIT)
 #define FEAT_SME_FA64		(1UL << FSME_FA64_BIT)
 #define FEAT_SME2		(1UL << FSME2_BIT)
+#endif
 
 /*
  * A descriptor used to describe and configure a test case.
@@ -56,10 +59,13 @@ struct tdescr {
 	/* just a name for the test-case; manadatory field */
 	char			*name;
 	char			*descr;
+/* Not used by selftests/arm */
+#ifdef __aarch64__
 	unsigned long		feats_required;
 	unsigned long		feats_incompatible;
 	/* bitmask of effectively supported feats: populated at run-time */
 	unsigned long		feats_supported;
+#endif
 	bool			initialized;
 	unsigned int		minsigstksz;
 	/* signum used as a test trigger. Zero if no trigger-signal is used */
@@ -69,8 +75,11 @@ struct tdescr {
 	 * Zero when no signal is expected on success
 	 */
 	int			sig_ok;
+/* Not used by selftests/arm */
+#ifdef __aarch64__
 	/* signum expected on unsupported CPU features. */
 	int			sig_unsupp;
+#endif
 	/* a timeout in second for test completion */
 	unsigned int		timeout;
 	bool			triggered;
@@ -79,10 +88,13 @@ struct tdescr {
 	/* optional sa_flags for the installed handler */
 	int			sa_flags;
 	ucontext_t		saved_uc;
+/* Not used by selftests/arm */
+#ifdef __aarch64__
 	/* used by get_current_ctx() */
 	size_t			live_sz;
 	ucontext_t		*live_uc;
 	volatile sig_atomic_t	live_uc_valid;
+#endif
 	/* optional test private data */
 	void			*priv;
 
diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/tools/testing/selftests/arm64/signal/test_signals_utils.c
index 0dc948db3a4a..8396d9748b48 100644
--- a/tools/testing/selftests/arm64/signal/test_signals_utils.c
+++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c
@@ -17,11 +17,16 @@
 
 #include "test_signals.h"
 #include "test_signals_utils.h"
+
+#ifdef __aarch64__
 #include "testcases/testcases.h"
+#endif
 
 
 extern struct tdescr *current;
 
+/* Not used by selftests/arm */
+#ifdef __aarch64__
 static int sig_copyctx = SIGTRAP;
 
 static char const *const feats_names[FMAX_END] = {
@@ -53,6 +58,7 @@ static inline char *feats_to_string(unsigned long feats)
 
 	return feats_string;
 }
+#endif
 
 static void unblock_signal(int signum)
 {
@@ -87,6 +93,7 @@ static void default_result(struct tdescr *td, bool force_exit)
  * take care of such unexpected situations.
  */
 
+#ifdef __aarch64__
 static bool handle_signal_unsupported(struct tdescr *td,
 				      siginfo_t *si, void *uc)
 {
@@ -108,6 +115,7 @@ static bool handle_signal_unsupported(struct tdescr *td,
 
 	return true;
 }
+#endif
 
 static bool handle_signal_trigger(struct tdescr *td,
 				  siginfo_t *si, void *uc)
@@ -127,10 +135,21 @@ static bool handle_signal_ok(struct tdescr *td,
 	 * if sig_trig was defined, it must have been used before getting here.
 	 */
 	assert(!td->sig_trig || td->triggered);
+
+#ifdef __aarch64__
 	fprintf(stderr,
 		"SIG_OK -- SP:0x%llX  si_addr@:%p  si_code:%d  token@:%p  offset:%ld\n",
 		((ucontext_t *)uc)->uc_mcontext.sp,
 		si->si_addr, si->si_code, td->token, td->token - si->si_addr);
+#else
+	fprintf(stderr,
+		"SIG_OK -- SP:0x%lX  si_addr@:%p  si_code:%d  token@:%p  offset:%d\n",
+		((ucontext_t *)uc)->uc_mcontext.arm_sp,
+		si->si_addr, si->si_code, td->token, td->token - si->si_addr);
+#endif
+
+#ifdef __aarch64__
+
 	/*
 	 * fake_sigreturn tests, which have sanity_enabled=1, set, at the very
 	 * last time, the token field to the SP address used to place the fake
@@ -153,6 +172,7 @@ static bool handle_signal_ok(struct tdescr *td,
 			"si_code != SEGV_ACCERR...test is probably broken!\n");
 		abort();
 	}
+#endif
 	td->pass = 1;
 	/*
 	 * Some tests can lead to SEGV loops: in such a case we want to
@@ -165,6 +185,7 @@ static bool handle_signal_ok(struct tdescr *td,
 	return true;
 }
 
+#ifdef __aarch64__
 static bool handle_signal_copyctx(struct tdescr *td,
 				  siginfo_t *si, void *uc_in)
 {
@@ -229,22 +250,31 @@ static bool handle_signal_copyctx(struct tdescr *td,
 
 	return true;
 }
+#endif
 
 static void default_handler(int signum, siginfo_t *si, void *uc)
 {
+#ifdef __aarch64__
 	if (current->sig_unsupp && signum == current->sig_unsupp &&
 	    handle_signal_unsupported(current, si, uc)) {
 		fprintf(stderr, "Handled SIG_UNSUPP\n");
-	} else if (current->sig_trig && signum == current->sig_trig &&
+	}
+#endif
+
+	if (current->sig_trig && signum == current->sig_trig &&
 		   handle_signal_trigger(current, si, uc)) {
 		fprintf(stderr, "Handled SIG_TRIG\n");
 	} else if (current->sig_ok && signum == current->sig_ok &&
 		   handle_signal_ok(current, si, uc)) {
 		fprintf(stderr, "Handled SIG_OK\n");
-	} else if (signum == sig_copyctx && current->live_uc &&
+	}
+#ifdef __aarch64__
+	else if (signum == sig_copyctx && current->live_uc &&
 		   handle_signal_copyctx(current, si, uc)) {
 		fprintf(stderr, "Handled SIG_COPYCTX\n");
-	} else {
+	}
+#endif
+	else {
 		if (signum == SIGALRM && current->timeout) {
 			fprintf(stderr, "-- Timeout !\n");
 		} else {
@@ -280,9 +310,10 @@ static int default_setup(struct tdescr *td)
 		unblock_signal(td->sig_trig);
 	if (td->sig_ok)
 		unblock_signal(td->sig_ok);
+#ifdef __aarch64__
 	if (td->sig_unsupp)
 		unblock_signal(td->sig_unsupp);
-
+#endif
 	if (td->timeout) {
 		unblock_signal(SIGALRM);
 		alarm(td->timeout);
@@ -299,6 +330,12 @@ static inline int default_trigger(struct tdescr *td)
 
 int test_init(struct tdescr *td)
 {
+	td->minsigstksz = getauxval(AT_MINSIGSTKSZ);
+	if (!td->minsigstksz)
+		td->minsigstksz = MINSIGSTKSZ;
+	fprintf(stderr, "Detected MINSTKSIGSZ:%d\n", td->minsigstksz);
+
+#ifdef __aarch64__
 	if (td->sig_trig == sig_copyctx) {
 		fprintf(stdout,
 			"Signal %d is RESERVED, cannot be used as a trigger. Aborting\n",
@@ -308,11 +345,6 @@ int test_init(struct tdescr *td)
 	/* just in case */
 	unblock_signal(sig_copyctx);
 
-	td->minsigstksz = getauxval(AT_MINSIGSTKSZ);
-	if (!td->minsigstksz)
-		td->minsigstksz = MINSIGSTKSZ;
-	fprintf(stderr, "Detected MINSTKSIGSZ:%d\n", td->minsigstksz);
-
 	if (td->feats_required || td->feats_incompatible) {
 		td->feats_supported = 0;
 		/*
@@ -357,6 +389,7 @@ int test_init(struct tdescr *td)
 			return 0;
 		}
 	}
+#endif
 
 	/* Perform test specific additional initialization */
 	if (td->init && !td->init(td)) {
diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/tools/testing/selftests/arm64/signal/test_signals_utils.h
index 762c8fe9c54a..50acfc1a1692 100644
--- a/tools/testing/selftests/arm64/signal/test_signals_utils.h
+++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h
@@ -18,6 +18,8 @@ void test_cleanup(struct tdescr *td);
 int test_run(struct tdescr *td);
 void test_result(struct tdescr *td);
 
+/* Not used by selftests/arm */
+#ifdef __aarch64__
 static inline bool feats_ok(struct tdescr *td)
 {
 	if (td->feats_incompatible & td->feats_supported)
@@ -146,3 +148,4 @@ static __always_inline bool get_current_context(struct tdescr *td,
 
 int fake_sigreturn(void *sigframe, size_t sz, int misalign_bytes);
 #endif
+#endif
-- 
2.39.2




More information about the linux-arm-kernel mailing list