194b69c61SNamhyung Kim#!/bin/sh 294b69c61SNamhyung Kim# perf stat metrics (shadow stat) test 394b69c61SNamhyung Kim# SPDX-License-Identifier: GPL-2.0 494b69c61SNamhyung Kim 594b69c61SNamhyung Kimset -e 694b69c61SNamhyung Kim 794b69c61SNamhyung Kim# skip if system-wide mode is forbidden 894b69c61SNamhyung Kimperf stat -a true > /dev/null 2>&1 || exit 2 994b69c61SNamhyung Kim 10a37f3b88SJin Yao# skip if on hybrid platform 11a37f3b88SJin Yaoperf stat -a -e cycles sleep 1 2>&1 | grep -e cpu_core && exit 2 12a37f3b88SJin Yao 1394b69c61SNamhyung Kimtest_global_aggr() 1494b69c61SNamhyung Kim{ 1594b69c61SNamhyung Kim perf stat -a --no-big-num -e cycles,instructions sleep 1 2>&1 | \ 1694b69c61SNamhyung Kim grep -e cycles -e instructions | \ 17*d13841e7SAthira Rajeev while read num evt _hash ipc rest 1894b69c61SNamhyung Kim do 1994b69c61SNamhyung Kim # skip not counted events 20a042a82dSNamhyung Kim if [ "$num" = "<not" ]; then 2194b69c61SNamhyung Kim continue 2294b69c61SNamhyung Kim fi 2394b69c61SNamhyung Kim 2494b69c61SNamhyung Kim # save cycles count 25a042a82dSNamhyung Kim if [ "$evt" = "cycles" ]; then 2694b69c61SNamhyung Kim cyc=$num 2794b69c61SNamhyung Kim continue 2894b69c61SNamhyung Kim fi 2994b69c61SNamhyung Kim 3094b69c61SNamhyung Kim # skip if no cycles 31a042a82dSNamhyung Kim if [ -z "$cyc" ]; then 3294b69c61SNamhyung Kim continue 3394b69c61SNamhyung Kim fi 3494b69c61SNamhyung Kim 3594b69c61SNamhyung Kim # use printf for rounding and a leading zero 36c4a1a776SSpoorthy S res=`printf "%.2f" "$(echo "scale=6; $num / $cyc" | bc -q)"` 37a042a82dSNamhyung Kim if [ "$ipc" != "$res" ]; then 3894b69c61SNamhyung Kim echo "IPC is different: $res != $ipc ($num / $cyc)" 3994b69c61SNamhyung Kim exit 1 4094b69c61SNamhyung Kim fi 4194b69c61SNamhyung Kim done 4294b69c61SNamhyung Kim} 4394b69c61SNamhyung Kim 4494b69c61SNamhyung Kimtest_no_aggr() 4594b69c61SNamhyung Kim{ 4694b69c61SNamhyung Kim perf stat -a -A --no-big-num -e cycles,instructions sleep 1 2>&1 | \ 4794b69c61SNamhyung Kim grep ^CPU | \ 48*d13841e7SAthira Rajeev while read cpu num evt _hash ipc rest 4994b69c61SNamhyung Kim do 5094b69c61SNamhyung Kim # skip not counted events 51a042a82dSNamhyung Kim if [ "$num" = "<not" ]; then 5294b69c61SNamhyung Kim continue 5394b69c61SNamhyung Kim fi 5494b69c61SNamhyung Kim 5594b69c61SNamhyung Kim # save cycles count 56a042a82dSNamhyung Kim if [ "$evt" = "cycles" ]; then 57a042a82dSNamhyung Kim results="$results $cpu:$num" 5894b69c61SNamhyung Kim continue 5994b69c61SNamhyung Kim fi 6094b69c61SNamhyung Kim 61a042a82dSNamhyung Kim cyc=${results##* $cpu:} 62a042a82dSNamhyung Kim cyc=${cyc%% *} 63a042a82dSNamhyung Kim 6494b69c61SNamhyung Kim # skip if no cycles 65a042a82dSNamhyung Kim if [ -z "$cyc" ]; then 6694b69c61SNamhyung Kim continue 6794b69c61SNamhyung Kim fi 6894b69c61SNamhyung Kim 6994b69c61SNamhyung Kim # use printf for rounding and a leading zero 70c4a1a776SSpoorthy S res=`printf "%.2f" "$(echo "scale=6; $num / $cyc" | bc -q)"` 71a042a82dSNamhyung Kim if [ "$ipc" != "$res" ]; then 7294b69c61SNamhyung Kim echo "IPC is different for $cpu: $res != $ipc ($num / $cyc)" 7394b69c61SNamhyung Kim exit 1 7494b69c61SNamhyung Kim fi 7594b69c61SNamhyung Kim done 7694b69c61SNamhyung Kim} 7794b69c61SNamhyung Kim 7894b69c61SNamhyung Kimtest_global_aggr 7994b69c61SNamhyung Kimtest_no_aggr 8094b69c61SNamhyung Kim 8194b69c61SNamhyung Kimexit 0 82