62 lines
		
	
	
		
			979 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			979 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-only
 | 
						|
// Copyright (C) 2021 ARM Limited.
 | 
						|
 | 
						|
#include "sme-inst.h"
 | 
						|
 | 
						|
.arch_extension sve
 | 
						|
 | 
						|
#define MAGIC     42
 | 
						|
 | 
						|
#define MAXVL     2048
 | 
						|
#define MAXVL_B   (MAXVL / 8)
 | 
						|
 | 
						|
.pushsection .text
 | 
						|
.data
 | 
						|
.align 4
 | 
						|
scratch:
 | 
						|
	.space	MAXVL_B
 | 
						|
.popsection
 | 
						|
 | 
						|
.globl fork_test
 | 
						|
fork_test:
 | 
						|
	smstart_za
 | 
						|
 | 
						|
	// For simplicity just set one word in one vector, other tests
 | 
						|
	// cover general data corruption issues.
 | 
						|
	ldr	x0, =scratch
 | 
						|
	mov	x1, #MAGIC
 | 
						|
	str	x1, [x0]
 | 
						|
	mov	w12, wzr
 | 
						|
	_ldr_za 12, 0			// ZA.H[W12] loaded from [X0]
 | 
						|
 | 
						|
	// Tail call into the C portion that does the fork & verify
 | 
						|
	b	fork_test_c
 | 
						|
 | 
						|
.globl verify_fork
 | 
						|
verify_fork:
 | 
						|
	// SVCR should have ZA=1, SM=0
 | 
						|
	mrs	x0, S3_3_C4_C2_2
 | 
						|
	and	x1, x0, #3
 | 
						|
	cmp	x1, #2
 | 
						|
	beq	1f
 | 
						|
	mov	x0, xzr
 | 
						|
	b	100f
 | 
						|
1:
 | 
						|
 | 
						|
	// ZA should still have the value we loaded
 | 
						|
	ldr	x0, =scratch
 | 
						|
	mov	w12, wzr
 | 
						|
	_str_za 12, 0			// ZA.H[W12] stored to [X0]
 | 
						|
	ldr	x1, [x0]
 | 
						|
	cmp	x1, #MAGIC
 | 
						|
	beq	2f
 | 
						|
	mov	x0, xzr
 | 
						|
	b	100f
 | 
						|
 | 
						|
2:
 | 
						|
	// All tests passed
 | 
						|
	mov	x0, #1
 | 
						|
100:
 | 
						|
	ret
 | 
						|
 |