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