1// SPDX-License-Identifier: GPL-2.0-only
2// Copyright (C) 2021 ARM Limited.
3// Original author: Mark Brown <broonie@kernel.org>
4//
5// Trivial syscall overhead benchmark.
6//
7// This is implemented in asm to ensure that we don't have any issues with
8// system libraries using instructions that disrupt the test.
9
10#include <asm/unistd.h>
11#include "assembler.h"
12
13.arch_extension sve
14
15.macro test_loop per_loop
16	mov	x10, x20
17	mov	x8, #__NR_getpid
18	mrs	x11, CNTVCT_EL0
191:
20	\per_loop
21	svc	#0
22	sub	x10, x10, #1
23	cbnz	x10, 1b
24
25	mrs	x12, CNTVCT_EL0
26	sub	x0, x12, x11
27	bl	putdec
28	puts	"\n"
29.endm
30
31// Main program entry point
32.globl _start
33function _start
34_start:
35	puts	"Iterations per test: "
36	mov	x20, #10000
37	lsl	x20, x20, #8
38	mov	x0, x20
39	bl	putdec
40	puts	"\n"
41
42	// Test having never used SVE
43	puts	"No SVE: "
44	test_loop
45
46	// Check for SVE support - should use hwcap but that's hard in asm
47	mrs	x0, ID_AA64PFR0_EL1
48	ubfx	x0, x0, #32, #4
49	cbnz	x0, 1f
50	puts	"System does not support SVE\n"
51	b	out
521:
53
54	// Execute a SVE instruction
55	puts	"SVE VL: "
56	rdvl	x0, #8
57	bl	putdec
58	puts	"\n"
59
60	puts	"SVE used once: "
61	test_loop
62
63	// Use SVE per syscall
64	puts	"SVE used per syscall: "
65	test_loop "rdvl x0, #8"
66
67	//  And we're done
68out:
69	mov	x0, #0
70	mov	x8, #__NR_exit
71	svc	#0
72