]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
kselftest/arm64: Check that SVCR is 0 in signal handlers
authorMark Brown <broonie@kernel.org>
Wed, 6 Nov 2024 17:07:51 +0000 (17:07 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 12 Nov 2024 13:18:13 +0000 (13:18 +0000)
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>
Link: https://lore.kernel.org/r/20241106-arm64-fpmr-signal-test-v1-1-31fa34ce58fe@kernel.org
[catalin.marinas@arm.com: Use %lx in fprintf() as uint64_t seems to be unsigned long in glibc]
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
tools/testing/selftests/arm64/signal/sve_helpers.h
tools/testing/selftests/arm64/signal/testcases/ssve_regs.c
tools/testing/selftests/arm64/signal/testcases/za_regs.c

index 50948ce471cc620118a0c7c8df70d66dbdfbb160..ca133b93375fa587b5e02cd76b2f2fcd92591723 100644 (file)
@@ -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
index 6dbe48cf8b09ed8b7a5ab47690bd87e39e18e1e6..1dbca9afb13c19386b8dcb155aff97639e7df7b2 100644 (file)
@@ -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 %lx\n", get_svcr());
+               return 1;
+       }
+
        return 0;
 }
 
index b9e13f27f1f9aaf55db2a5e391f360993561d0b7..badaead5326af79972db8bdaf7552d6e437d0d7e 100644 (file)
@@ -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 %lx\n", get_svcr());
+               return 1;
+       }
+
        return 0;
 }