162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# Test data symbol
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
562306a36Sopenharmony_ci# Leo Yan <leo.yan@linaro.org>, 2022
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciskip_if_no_mem_event() {
862306a36Sopenharmony_ci	perf mem record -e list 2>&1 | grep -E -q 'available' && return 0
962306a36Sopenharmony_ci	return 2
1062306a36Sopenharmony_ci}
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciskip_if_no_mem_event || exit 2
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ciTEST_PROGRAM="perf test -w datasym"
1562306a36Sopenharmony_ciPERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cicheck_result() {
1862306a36Sopenharmony_ci	# The memory report format is as below:
1962306a36Sopenharmony_ci	#    99.92%  ...  [.] buf1+0x38
2062306a36Sopenharmony_ci	result=$(perf mem report -i ${PERF_DATA} -s symbol_daddr -q 2>&1 |
2162306a36Sopenharmony_ci		 awk '/buf1/ { print $4 }')
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	# Testing is failed if has no any sample for "buf1"
2462306a36Sopenharmony_ci	[ -z "$result" ] && return 1
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	while IFS= read -r line; do
2762306a36Sopenharmony_ci		# The "data1" and "data2" fields in structure "buf1" have
2862306a36Sopenharmony_ci		# offset "0x0" and "0x38", returns failure if detect any
2962306a36Sopenharmony_ci		# other offset value.
3062306a36Sopenharmony_ci		if [ "$line" != "buf1+0x0" ] && [ "$line" != "buf1+0x38" ]; then
3162306a36Sopenharmony_ci			return 1
3262306a36Sopenharmony_ci		fi
3362306a36Sopenharmony_ci	done <<< "$result"
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return 0
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cicleanup_files()
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	echo "Cleaning up files..."
4162306a36Sopenharmony_ci	rm -f ${PERF_DATA}
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_citrap cleanup_files exit term int
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ciecho "Recording workload..."
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci# perf mem/c2c internally uses IBS PMU on AMD CPU which doesn't support
4962306a36Sopenharmony_ci# user/kernel filtering and per-process monitoring, spin program on
5062306a36Sopenharmony_ci# specific CPU and test in per-CPU mode.
5162306a36Sopenharmony_ciis_amd=$(grep -E -c 'vendor_id.*AuthenticAMD' /proc/cpuinfo)
5262306a36Sopenharmony_ciif (($is_amd >= 1)); then
5362306a36Sopenharmony_ci	perf mem record -o ${PERF_DATA} -C 0 -- taskset -c 0 $TEST_PROGRAM &
5462306a36Sopenharmony_cielse
5562306a36Sopenharmony_ci	perf mem record --all-user -o ${PERF_DATA} -- $TEST_PROGRAM &
5662306a36Sopenharmony_cifi
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciPERFPID=$!
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cisleep 1
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cikill $PERFPID
6362306a36Sopenharmony_ciwait $PERFPID
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cicheck_result
6662306a36Sopenharmony_ciexit $?
67