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