162306a36Sopenharmony_ci#!/bin/sh 262306a36Sopenharmony_ci# perf stat metrics (shadow stat) test 362306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciset -e 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci# skip if system-wide mode is forbidden 862306a36Sopenharmony_ciperf stat -a true > /dev/null 2>&1 || exit 2 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci# skip if on hybrid platform 1162306a36Sopenharmony_ciperf stat -a -e cycles sleep 1 2>&1 | grep -e cpu_core && exit 2 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_citest_global_aggr() 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci perf stat -a --no-big-num -e cycles,instructions sleep 1 2>&1 | \ 1662306a36Sopenharmony_ci grep -e cycles -e instructions | \ 1762306a36Sopenharmony_ci while read num evt _hash ipc rest 1862306a36Sopenharmony_ci do 1962306a36Sopenharmony_ci # skip not counted events 2062306a36Sopenharmony_ci if [ "$num" = "<not" ]; then 2162306a36Sopenharmony_ci continue 2262306a36Sopenharmony_ci fi 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci # save cycles count 2562306a36Sopenharmony_ci if [ "$evt" = "cycles" ]; then 2662306a36Sopenharmony_ci cyc=$num 2762306a36Sopenharmony_ci continue 2862306a36Sopenharmony_ci fi 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci # skip if no cycles 3162306a36Sopenharmony_ci if [ -z "$cyc" ]; then 3262306a36Sopenharmony_ci continue 3362306a36Sopenharmony_ci fi 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci # use printf for rounding and a leading zero 3662306a36Sopenharmony_ci res=`printf "%.2f" "$(echo "scale=6; $num / $cyc" | bc -q)"` 3762306a36Sopenharmony_ci if [ "$ipc" != "$res" ]; then 3862306a36Sopenharmony_ci echo "IPC is different: $res != $ipc ($num / $cyc)" 3962306a36Sopenharmony_ci exit 1 4062306a36Sopenharmony_ci fi 4162306a36Sopenharmony_ci done 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_citest_no_aggr() 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci perf stat -a -A --no-big-num -e cycles,instructions sleep 1 2>&1 | \ 4762306a36Sopenharmony_ci grep ^CPU | \ 4862306a36Sopenharmony_ci while read cpu num evt _hash ipc rest 4962306a36Sopenharmony_ci do 5062306a36Sopenharmony_ci # skip not counted events 5162306a36Sopenharmony_ci if [ "$num" = "<not" ]; then 5262306a36Sopenharmony_ci continue 5362306a36Sopenharmony_ci fi 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci # save cycles count 5662306a36Sopenharmony_ci if [ "$evt" = "cycles" ]; then 5762306a36Sopenharmony_ci results="$results $cpu:$num" 5862306a36Sopenharmony_ci continue 5962306a36Sopenharmony_ci fi 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci cyc=${results##* $cpu:} 6262306a36Sopenharmony_ci cyc=${cyc%% *} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci # skip if no cycles 6562306a36Sopenharmony_ci if [ -z "$cyc" ]; then 6662306a36Sopenharmony_ci continue 6762306a36Sopenharmony_ci fi 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci # use printf for rounding and a leading zero 7062306a36Sopenharmony_ci res=`printf "%.2f" "$(echo "scale=6; $num / $cyc" | bc -q)"` 7162306a36Sopenharmony_ci if [ "$ipc" != "$res" ]; then 7262306a36Sopenharmony_ci echo "IPC is different for $cpu: $res != $ipc ($num / $cyc)" 7362306a36Sopenharmony_ci exit 1 7462306a36Sopenharmony_ci fi 7562306a36Sopenharmony_ci done 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_citest_global_aggr 7962306a36Sopenharmony_citest_no_aggr 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciexit 0 82