diff mbox series

kselftest/arm64: abi: fix SVCR detection

Message ID 20241209105237.10498-1-o451686892@gmail.com
State New
Headers show
Series kselftest/arm64: abi: fix SVCR detection | expand

Commit Message

Weizhao Ouyang Dec. 9, 2024, 10:52 a.m. UTC
When using svcr_in to check ZA and Streaming Mode, we should make sure
that the value in x2 is correct, otherwise it may trigger an Illegal
instruction if FEAT_SVE and !FEAT_SME.

Fixes: 43e3f85523e4 ("kselftest/arm64: Add SME support to syscall ABI test")
Signed-off-by: Weizhao Ouyang <o451686892@gmail.com>
---
 tools/testing/selftests/arm64/abi/syscall-abi-asm.S | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Weizhao Ouyang Dec. 9, 2024, 12:51 p.m. UTC | #1
On Mon, Dec 9, 2024 at 8:36 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Mon, Dec 09, 2024 at 06:52:37PM +0800, Weizhao Ouyang wrote:
>
> > When using svcr_in to check ZA and Streaming Mode, we should make sure
> > that the value in x2 is correct, otherwise it may trigger an Illegal
> > instruction if FEAT_SVE and !FEAT_SME.
>
> >       // Set SVCR if we're doing SME
> > -     cbz     x1, 1f
> >       adrp    x2, svcr_in
> >       ldr     x2, [x2, :lo12:svcr_in]
> > +     cbz     x1, 1f
> >       msr     S3_3_C4_C2_2, x2
>
> This is against an older verison of the code so wouldn't apply now.
> It's not also checking the value of SVCR, this is checking the SME flag
> passed in via x1.  You can see that the SVCR value is loaded into x2 but
> the check is against x1.

Hi Mark,

This patch aims to fix the second check (SVCR_ZA_SHIFT) instead of
the first one (the x1 SME flag you're referring to):

// Load ZA and ZT0 if enabled - uses x12 as scratch due to SME LDR
tbz x2, #SVCR_ZA_SHIFT, 1f
mov w12, #0
ldr x2, =za_in
2: _ldr_za 12, 2

If SME disabled, x2 will not have an expected value.

BR,
Weizhao
Weizhao Ouyang Dec. 9, 2024, 1:26 p.m. UTC | #2
On Mon, Dec 9, 2024 at 9:12 PM Mark Brown <broonie@kernel.org> wrote:
>
> On Mon, Dec 09, 2024 at 08:51:28PM +0800, Weizhao Ouyang wrote:
> > On Mon, Dec 9, 2024 at 8:36 PM Mark Brown <broonie@kernel.org> wrote:
>
> > > >       // Set SVCR if we're doing SME
> > > > -     cbz     x1, 1f
> > > >       adrp    x2, svcr_in
> > > >       ldr     x2, [x2, :lo12:svcr_in]
> > > > +     cbz     x1, 1f
> > > >       msr     S3_3_C4_C2_2, x2
>
> > > This is against an older verison of the code so wouldn't apply now.
> > > It's not also checking the value of SVCR, this is checking the SME flag
> > > the check is against x1.
>
> > This patch aims to fix the second check (SVCR_ZA_SHIFT) instead of
> > the first one (the x1 SME flag you're referring to):
>
> If we don't have SME we should be skipping over all the SME code and
> never even looking at the value of SVCR.  Looking at the current version
> of the code it does that, it branches to check_sve_in if SME is not
> enabled.

Hi Mark,

Yes we should skip it, this is just a minor tweak based on the
current implementation, after all, we manually passed its value by
svcr_in.

Which latest code version are you referring to? I think check_sve_in
is in fp testcase, not in the abi testcase. (checked the -next tree)

BR,
Weizhao
diff mbox series

Patch

diff --git a/tools/testing/selftests/arm64/abi/syscall-abi-asm.S b/tools/testing/selftests/arm64/abi/syscall-abi-asm.S
index df3230fdac39..98cde4f37abf 100644
--- a/tools/testing/selftests/arm64/abi/syscall-abi-asm.S
+++ b/tools/testing/selftests/arm64/abi/syscall-abi-asm.S
@@ -81,9 +81,9 @@  do_syscall:
 	stp	x27, x28, [sp, #96]
 
 	// Set SVCR if we're doing SME
-	cbz	x1, 1f
 	adrp	x2, svcr_in
 	ldr	x2, [x2, :lo12:svcr_in]
+	cbz	x1, 1f
 	msr	S3_3_C4_C2_2, x2
 1: