// SPDX-License-Identifier: GPL-2.0-only // Copyright (C) 2021 ARM Limited. // Original author: Mark Brown <broonie@kernel.org> // // Trivial syscall overhead benchmark. // // This is implemented in asm to ensure that we don't have any issues with // system libraries using instructions that disrupt the test. #include <asm/unistd.h> #include "assembler.h" .arch_extension sve .macro test_loop per_loop mov x10, x20 mov x8, #__NR_getpid mrs x11, CNTVCT_EL0 1: \per_loop svc #0 sub x10, x10, #1 cbnz x10, 1b mrs x12, CNTVCT_EL0 sub x0, x12, x11 bl putdec puts "\n" .endm // Main program entry point .globl _start function _start puts "Iterations per test: " mov x20, #10000 lsl x20, x20, #8 mov x0, x20 bl putdec puts "\n" // Test having never used SVE puts "No SVE: " test_loop // Check for SVE support - should use hwcap but that's hard in asm mrs x0, ID_AA64PFR0_EL1 ubfx x0, x0, #32, #4 cbnz x0, 1f puts "System does not support SVE\n" b out 1: // Execute a SVE instruction puts "SVE VL: " rdvl x0, #8 bl putdec puts "\n" puts "SVE used once: " test_loop // Use SVE per syscall puts "SVE used per syscall: " test_loop "rdvl x0, #8" // And we're done out: mov x0, #0 mov x8, #__NR_exit svc #0