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