160abedb8SLeo Yan#!/bin/bash
260abedb8SLeo Yan# Test data symbol
360abedb8SLeo Yan
460abedb8SLeo Yan# SPDX-License-Identifier: GPL-2.0
560abedb8SLeo Yan# Leo Yan <leo.yan@linaro.org>, 2022
660abedb8SLeo Yan
760abedb8SLeo Yanskip_if_no_mem_event() {
8*818448e9STiezhu Yang	perf mem record -e list 2>&1 | grep -E -q 'available' && return 0
960abedb8SLeo Yan	return 2
1060abedb8SLeo Yan}
1160abedb8SLeo Yan
1260abedb8SLeo Yanskip_if_no_mem_event || exit 2
1360abedb8SLeo Yan
140b77fe47SNamhyung KimTEST_PROGRAM="perf test -w datasym"
1560abedb8SLeo YanPERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
1660abedb8SLeo Yan
1760abedb8SLeo Yancheck_result() {
1860abedb8SLeo Yan	# The memory report format is as below:
1960abedb8SLeo Yan	#    99.92%  ...  [.] buf1+0x38
2060abedb8SLeo Yan	result=$(perf mem report -i ${PERF_DATA} -s symbol_daddr -q 2>&1 |
2160abedb8SLeo Yan		 awk '/buf1/ { print $4 }')
2260abedb8SLeo Yan
2360abedb8SLeo Yan	# Testing is failed if has no any sample for "buf1"
2460abedb8SLeo Yan	[ -z "$result" ] && return 1
2560abedb8SLeo Yan
2660abedb8SLeo Yan	while IFS= read -r line; do
2760abedb8SLeo Yan		# The "data1" and "data2" fields in structure "buf1" have
2860abedb8SLeo Yan		# offset "0x0" and "0x38", returns failure if detect any
2960abedb8SLeo Yan		# other offset value.
3060abedb8SLeo Yan		if [ "$line" != "buf1+0x0" ] && [ "$line" != "buf1+0x38" ]; then
3160abedb8SLeo Yan			return 1
3260abedb8SLeo Yan		fi
3360abedb8SLeo Yan	done <<< "$result"
3460abedb8SLeo Yan
3560abedb8SLeo Yan	return 0
3660abedb8SLeo Yan}
3760abedb8SLeo Yan
3860abedb8SLeo Yancleanup_files()
3960abedb8SLeo Yan{
4060abedb8SLeo Yan	echo "Cleaning up files..."
4160abedb8SLeo Yan	rm -f ${PERF_DATA}
4260abedb8SLeo Yan}
4360abedb8SLeo Yan
4460abedb8SLeo Yantrap cleanup_files exit term int
4560abedb8SLeo Yan
4660abedb8SLeo Yanecho "Recording workload..."
4760abedb8SLeo Yan
4860abedb8SLeo Yan# perf mem/c2c internally uses IBS PMU on AMD CPU which doesn't support
4960abedb8SLeo Yan# user/kernel filtering and per-process monitoring, spin program on
5060abedb8SLeo Yan# specific CPU and test in per-CPU mode.
51*818448e9STiezhu Yangis_amd=$(grep -E -c 'vendor_id.*AuthenticAMD' /proc/cpuinfo)
5260abedb8SLeo Yanif (($is_amd >= 1)); then
5360abedb8SLeo Yan	perf mem record -o ${PERF_DATA} -C 0 -- taskset -c 0 $TEST_PROGRAM &
5460abedb8SLeo Yanelse
5560abedb8SLeo Yan	perf mem record --all-user -o ${PERF_DATA} -- $TEST_PROGRAM &
5660abedb8SLeo Yanfi
5760abedb8SLeo Yan
5860abedb8SLeo YanPERFPID=$!
5960abedb8SLeo Yan
6060abedb8SLeo Yansleep 1
6160abedb8SLeo Yan
6260abedb8SLeo Yankill $PERFPID
6360abedb8SLeo Yanwait $PERFPID
6460abedb8SLeo Yan
6560abedb8SLeo Yancheck_result
6660abedb8SLeo Yanexit $?
67