Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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