162306a36Sopenharmony_ci#!/bin/sh 262306a36Sopenharmony_ci# Check Arm SPE trace data recording and synthesized samples 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci# Uses the 'perf record' to record trace data of Arm SPE events; 562306a36Sopenharmony_ci# then verify if any SPE event samples are generated by SPE with 662306a36Sopenharmony_ci# 'perf script' and 'perf report' commands. 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 962306a36Sopenharmony_ci# German Gomez <german.gomez@arm.com>, 2021 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciskip_if_no_arm_spe_event() { 1262306a36Sopenharmony_ci perf list | grep -E -q 'arm_spe_[0-9]+//' && return 0 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci # arm_spe event doesn't exist 1562306a36Sopenharmony_ci return 2 1662306a36Sopenharmony_ci} 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciskip_if_no_arm_spe_event || exit 2 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciperfdata=$(mktemp /tmp/__perf_test.perf.data.XXXXX) 2162306a36Sopenharmony_ciglb_err=0 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cicleanup_files() 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci rm -f ${perfdata} 2662306a36Sopenharmony_ci rm -f ${perfdata}.old 2762306a36Sopenharmony_ci exit $glb_err 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_citrap cleanup_files EXIT TERM INT 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ciarm_spe_report() { 3362306a36Sopenharmony_ci if [ $2 = 0 ]; then 3462306a36Sopenharmony_ci echo "$1: PASS" 3562306a36Sopenharmony_ci elif [ $2 = 2 ]; then 3662306a36Sopenharmony_ci echo "$1: SKIPPED" 3762306a36Sopenharmony_ci else 3862306a36Sopenharmony_ci echo "$1: FAIL" 3962306a36Sopenharmony_ci glb_err=$2 4062306a36Sopenharmony_ci fi 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ciperf_script_samples() { 4462306a36Sopenharmony_ci echo "Looking at perf.data file for dumping samples:" 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci # from arm-spe.c/arm_spe_synth_events() 4762306a36Sopenharmony_ci events="(ld1-miss|ld1-access|llc-miss|lld-access|tlb-miss|tlb-access|branch-miss|remote-access|memory)" 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci # Below is an example of the samples dumping: 5062306a36Sopenharmony_ci # dd 3048 [002] 1 l1d-access: ffffaa64999c __GI___libc_write+0x3c (/lib/aarch64-linux-gnu/libc-2.27.so) 5162306a36Sopenharmony_ci # dd 3048 [002] 1 tlb-access: ffffaa64999c __GI___libc_write+0x3c (/lib/aarch64-linux-gnu/libc-2.27.so) 5262306a36Sopenharmony_ci # dd 3048 [002] 1 memory: ffffaa64999c __GI___libc_write+0x3c (/lib/aarch64-linux-gnu/libc-2.27.so) 5362306a36Sopenharmony_ci perf script -F,-time -i ${perfdata} 2>&1 | \ 5462306a36Sopenharmony_ci grep -E " +$1 +[0-9]+ .* +${events}:(.*:)? +" > /dev/null 2>&1 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciperf_report_samples() { 5862306a36Sopenharmony_ci echo "Looking at perf.data file for reporting samples:" 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci # Below is an example of the samples reporting: 6162306a36Sopenharmony_ci # 73.04% 73.04% dd libc-2.27.so [.] _dl_addr 6262306a36Sopenharmony_ci # 7.71% 7.71% dd libc-2.27.so [.] getenv 6362306a36Sopenharmony_ci # 2.59% 2.59% dd ld-2.27.so [.] strcmp 6462306a36Sopenharmony_ci perf report --stdio -i ${perfdata} 2>&1 | \ 6562306a36Sopenharmony_ci grep -E " +[0-9]+\.[0-9]+% +[0-9]+\.[0-9]+% +$1 " > /dev/null 2>&1 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ciarm_spe_snapshot_test() { 6962306a36Sopenharmony_ci echo "Recording trace with snapshot mode $perfdata" 7062306a36Sopenharmony_ci perf record -o ${perfdata} -e arm_spe// -S \ 7162306a36Sopenharmony_ci -- dd if=/dev/zero of=/dev/null > /dev/null 2>&1 & 7262306a36Sopenharmony_ci PERFPID=$! 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci # Wait for perf program 7562306a36Sopenharmony_ci sleep 1 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci # Send signal to snapshot trace data 7862306a36Sopenharmony_ci kill -USR2 $PERFPID 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci # Stop perf program 8162306a36Sopenharmony_ci kill $PERFPID 8262306a36Sopenharmony_ci wait $PERFPID 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci perf_script_samples dd && 8562306a36Sopenharmony_ci perf_report_samples dd 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci err=$? 8862306a36Sopenharmony_ci arm_spe_report "SPE snapshot testing" $err 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ciarm_spe_system_wide_test() { 9262306a36Sopenharmony_ci echo "Recording trace with system-wide mode $perfdata" 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci perf record -o - -e dummy -a -B true > /dev/null 2>&1 9562306a36Sopenharmony_ci if [ $? != 0 ]; then 9662306a36Sopenharmony_ci arm_spe_report "SPE system-wide testing" 2 9762306a36Sopenharmony_ci return 9862306a36Sopenharmony_ci fi 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci perf record -o ${perfdata} -e arm_spe// -a --no-bpf-event \ 10162306a36Sopenharmony_ci -- dd if=/dev/zero of=/dev/null count=100000 > /dev/null 2>&1 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci perf_script_samples dd && 10462306a36Sopenharmony_ci perf_report_samples dd 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci err=$? 10762306a36Sopenharmony_ci arm_spe_report "SPE system-wide testing" $err 10862306a36Sopenharmony_ci} 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ciarm_spe_snapshot_test 11162306a36Sopenharmony_ciarm_spe_system_wide_test 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ciexit $glb_err 114