new file mode 100644
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals.c"
new file mode 100644
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals.h"
new file mode 100644
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals_utils.c"
new file mode 100644
@@ -0,0 +1,2 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "../../arm64/signal/test_signals_utils.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;
@@ -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)) {
@@ -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
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@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