Commit 116e50d6 authored by Mark Brown's avatar Mark Brown Committed by Catalin Marinas
Browse files

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



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: default avatarMark 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: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 694e2803
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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
+5 −0
Original line number Diff line number Diff line
@@ -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;
}

+5 −0
Original line number Diff line number Diff line
@@ -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;
}