diff mbox series

kselftest/arm64: Check that SVCR is 0 in signal handlers

Message ID 20241106-arm64-fpmr-signal-test-v1-1-31fa34ce58fe@kernel.org
State Accepted
Commit 116e50d6474e82579086c0397d2fa3999815f29e
Headers show
Series kselftest/arm64: Check that SVCR is 0 in signal handlers | expand

Commit Message

Mark Brown Nov. 6, 2024, 5:07 p.m. UTC
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(+)


---
base-commit: 8e929cb546ee42c9a61d24fae60605e9e3192354
change-id: 20241106-arm64-fpmr-signal-test-c0a0c5bf0174

Best regards,

Comments

Catalin Marinas Nov. 12, 2024, 11:30 a.m. UTC | #1
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.
Mark Brown Nov. 12, 2024, 1:25 p.m. UTC | #2
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 :(
Catalin Marinas Nov. 12, 2024, 4:07 p.m. UTC | #3
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
diff mbox series

Patch

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;
 }