162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci// Copyright (C) 2021 ARM Limited.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include "sme-inst.h"
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci.arch_extension sve
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#define MAGIC     42
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#define MAXVL     2048
1162306a36Sopenharmony_ci#define MAXVL_B   (MAXVL / 8)
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci.pushsection .text
1462306a36Sopenharmony_ci.data
1562306a36Sopenharmony_ci.align 4
1662306a36Sopenharmony_ciscratch:
1762306a36Sopenharmony_ci	.space	MAXVL_B
1862306a36Sopenharmony_ci.popsection
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci.globl fork_test
2162306a36Sopenharmony_cifork_test:
2262306a36Sopenharmony_ci	smstart_za
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	// For simplicity just set one word in one vector, other tests
2562306a36Sopenharmony_ci	// cover general data corruption issues.
2662306a36Sopenharmony_ci	ldr	x0, =scratch
2762306a36Sopenharmony_ci	mov	x1, #MAGIC
2862306a36Sopenharmony_ci	str	x1, [x0]
2962306a36Sopenharmony_ci	mov	w12, wzr
3062306a36Sopenharmony_ci	_ldr_za 12, 0			// ZA.H[W12] loaded from [X0]
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	// Tail call into the C portion that does the fork & verify
3362306a36Sopenharmony_ci	b	fork_test_c
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci.globl verify_fork
3662306a36Sopenharmony_civerify_fork:
3762306a36Sopenharmony_ci	// SVCR should have ZA=1, SM=0
3862306a36Sopenharmony_ci	mrs	x0, S3_3_C4_C2_2
3962306a36Sopenharmony_ci	and	x1, x0, #3
4062306a36Sopenharmony_ci	cmp	x1, #2
4162306a36Sopenharmony_ci	beq	1f
4262306a36Sopenharmony_ci	mov	x0, xzr
4362306a36Sopenharmony_ci	b	100f
4462306a36Sopenharmony_ci1:
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	// ZA should still have the value we loaded
4762306a36Sopenharmony_ci	ldr	x0, =scratch
4862306a36Sopenharmony_ci	mov	w12, wzr
4962306a36Sopenharmony_ci	_str_za 12, 0			// ZA.H[W12] stored to [X0]
5062306a36Sopenharmony_ci	ldr	x1, [x0]
5162306a36Sopenharmony_ci	cmp	x1, #MAGIC
5262306a36Sopenharmony_ci	beq	2f
5362306a36Sopenharmony_ci	mov	x0, xzr
5462306a36Sopenharmony_ci	b	100f
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci2:
5762306a36Sopenharmony_ci	// All tests passed
5862306a36Sopenharmony_ci	mov	x0, #1
5962306a36Sopenharmony_ci100:
6062306a36Sopenharmony_ci	ret
6162306a36Sopenharmony_ci
62