We don't currently validate that we exit streaming mode and clear ZA when we enter a signal handler. Add simple checks for this in the SSVE and ZA tests.
Signed-off-by: Mark Brown broonie@kernel.org --- tools/testing/selftests/arm64/signal/sve_helpers.h | 13 +++++++++++++ tools/testing/selftests/arm64/signal/testcases/ssve_regs.c | 5 +++++ tools/testing/selftests/arm64/signal/testcases/za_regs.c | 5 +++++ 3 files changed, 23 insertions(+)
diff --git a/tools/testing/selftests/arm64/signal/sve_helpers.h b/tools/testing/selftests/arm64/signal/sve_helpers.h index 50948ce471cc620118a0c7c8df70d66dbdfbb160..ca133b93375fa587b5e02cd76b2f2fcd92591723 100644 --- a/tools/testing/selftests/arm64/signal/sve_helpers.h +++ b/tools/testing/selftests/arm64/signal/sve_helpers.h @@ -18,4 +18,17 @@ extern unsigned int nvls;
int sve_fill_vls(bool use_sme, int min_vls);
+static inline uint64_t get_svcr(void) +{ + uint64_t val; + + asm volatile ( + "mrs %0, S3_3_C4_C2_2\n" + : "=r"(val) + : + : "cc"); + + return val; +} + #endif diff --git a/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c b/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c index 6dbe48cf8b09ed8b7a5ab47690bd87e39e18e1e6..3dee68fa36d1cf2716f54d5f328b3f4077493c3b 100644 --- a/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c +++ b/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c @@ -85,6 +85,11 @@ static int do_one_sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc, fprintf(stderr, "Got expected size %u and VL %d\n", head->size, ssve->vl);
+ if (get_svcr() != 0) { + fprintf(stderr, "Unexpected SVCR %llx\n", get_svcr()); + return 1; + } + return 0; }
diff --git a/tools/testing/selftests/arm64/signal/testcases/za_regs.c b/tools/testing/selftests/arm64/signal/testcases/za_regs.c index b9e13f27f1f9aaf55db2a5e391f360993561d0b7..9fff4c50030414d06157e0da0c29fd794f707309 100644 --- a/tools/testing/selftests/arm64/signal/testcases/za_regs.c +++ b/tools/testing/selftests/arm64/signal/testcases/za_regs.c @@ -91,6 +91,11 @@ static int do_one_sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc, return 1; }
+ if (get_svcr() != 0) { + fprintf(stderr, "Unexpected SVCR %llx\n", get_svcr()); + return 1; + } + return 0; }
--- base-commit: 8e929cb546ee42c9a61d24fae60605e9e3192354 change-id: 20241106-arm64-fpmr-signal-test-c0a0c5bf0174
Best regards,
On Wed, Nov 06, 2024 at 05:07:51PM +0000, Mark Brown wrote:
diff --git a/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c b/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c index 6dbe48cf8b09ed8b7a5ab47690bd87e39e18e1e6..3dee68fa36d1cf2716f54d5f328b3f4077493c3b 100644 --- a/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c +++ b/tools/testing/selftests/arm64/signal/testcases/ssve_regs.c @@ -85,6 +85,11 @@ static int do_one_sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc, fprintf(stderr, "Got expected size %u and VL %d\n", head->size, ssve->vl);
- if (get_svcr() != 0) {
fprintf(stderr, "Unexpected SVCR %llx\n", get_svcr());
return 1;
- }
- return 0;
} diff --git a/tools/testing/selftests/arm64/signal/testcases/za_regs.c b/tools/testing/selftests/arm64/signal/testcases/za_regs.c index b9e13f27f1f9aaf55db2a5e391f360993561d0b7..9fff4c50030414d06157e0da0c29fd794f707309 100644 --- a/tools/testing/selftests/arm64/signal/testcases/za_regs.c +++ b/tools/testing/selftests/arm64/signal/testcases/za_regs.c @@ -91,6 +91,11 @@ static int do_one_sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc, return 1; }
- if (get_svcr() != 0) {
fprintf(stderr, "Unexpected SVCR %llx\n", get_svcr());
return 1;
- }
I think I'll change both printf specifiers to %lx here since in the libc I have installed, uin64_t is an unsigned long (the kernel defines it as unsigned long long). Both gcc and clang complain but the compiler shouldn't matter since the headers come with glibc.
On Tue, Nov 12, 2024 at 11:30:14AM +0000, Catalin Marinas wrote:
On Wed, Nov 06, 2024 at 05:07:51PM +0000, Mark Brown wrote:
fprintf(stderr, "Unexpected SVCR %llx\n", get_svcr());
return 1;
- }
I think I'll change both printf specifiers to %lx here since in the libc I have installed, uin64_t is an unsigned long (the kernel defines it as unsigned long long). Both gcc and clang complain but the compiler shouldn't matter since the headers come with glibc.
Makes sense. I do wish the compilers were more consistent with including these warnings :(
On Wed, 06 Nov 2024 17:07:51 +0000, Mark Brown wrote:
We don't currently validate that we exit streaming mode and clear ZA when we enter a signal handler. Add simple checks for this in the SSVE and ZA tests.
Applied to arm64 (for-next/kselftest), thanks!
[1/1] kselftest/arm64: Check that SVCR is 0 in signal handlers https://git.kernel.org/arm64/c/116e50d6474e
linux-kselftest-mirror@lists.linaro.org