1*ccf62a26SJames Clark#!/bin/bash -e 2*ccf62a26SJames Clark# CoreSight deterministic workload decode (exclusive) 3*ccf62a26SJames Clark 4*ccf62a26SJames Clark# SPDX-License-Identifier: GPL-2.0 5*ccf62a26SJames Clark 6*ccf62a26SJames Clark# If CoreSight is not available, skip the test 7*ccf62a26SJames Clarkperf list pmu | grep -q cs_etm || exit 2 8*ccf62a26SJames Clark 9*ccf62a26SJames Clarktmpdir=$(mktemp -d /tmp/__perf_test.coresight_deterministic.XXXXX) 10*ccf62a26SJames Clark 11*ccf62a26SJames Clarkcleanup() { 12*ccf62a26SJames Clark rm -rf "${tmpdir}" 13*ccf62a26SJames Clark trap - EXIT TERM INT 14*ccf62a26SJames Clark} 15*ccf62a26SJames Clark 16*ccf62a26SJames Clarktrap_cleanup() { 17*ccf62a26SJames Clark cleanup 18*ccf62a26SJames Clark exit 1 19*ccf62a26SJames Clark} 20*ccf62a26SJames Clarktrap trap_cleanup EXIT TERM INT 21*ccf62a26SJames Clark 22*ccf62a26SJames Clarkcf="$tmpdir/ctl" 23*ccf62a26SJames Clarkaf="$tmpdir/ack" 24*ccf62a26SJames Clarkmkfifo "$cf" "$af" 25*ccf62a26SJames Clark 26*ccf62a26SJames Clark# Start disabled and use the control FIFO to only record the workload and not 27*ccf62a26SJames Clark# startup. 28*ccf62a26SJames Clarkperf record -o "$tmpdir/data" -e cs_etm//u -D -1 --control fifo:"$cf","$af" -- \ 29*ccf62a26SJames Clark perf test --record-ctl fifo:"$cf","$af" -w deterministic > /dev/null 2>&1 30*ccf62a26SJames Clark 31*ccf62a26SJames Clarkperf script -i "$tmpdir/data" --itrace=i1i -F ip,srcline | \ 32*ccf62a26SJames Clark grep "deterministic.c" | uniq > "$tmpdir/script" 2>/dev/null 33*ccf62a26SJames Clark 34*ccf62a26SJames Clark 35*ccf62a26SJames Clark# Remove brace lines and call sites as they may not be hit or may have 36*ccf62a26SJames Clark# extra hits after returning, depending on the compiler. 37*ccf62a26SJames Clarksed -i \ 38*ccf62a26SJames Clark -e '/deterministic.c:8$/d' \ 39*ccf62a26SJames Clark -e '/deterministic.c:12$/d' \ 40*ccf62a26SJames Clark -e '/deterministic.c:15$/d' \ 41*ccf62a26SJames Clark -e '/deterministic.c:19$/d' \ 42*ccf62a26SJames Clark -e '/deterministic.c:23$/d' \ 43*ccf62a26SJames Clark -e '/deterministic.c:28$/d' \ 44*ccf62a26SJames Clark -e '/deterministic.c:34$/d' \ 45*ccf62a26SJames Clark -e '/deterministic.c:36$/d' \ 46*ccf62a26SJames Clark -e '/deterministic.c:37$/d' \ 47*ccf62a26SJames Clark "$tmpdir/script" 48*ccf62a26SJames Clark 49*ccf62a26SJames Clarkcat > "$tmpdir/expected" << EOF 50*ccf62a26SJames Clark deterministic.c:24 51*ccf62a26SJames Clark deterministic.c:25 52*ccf62a26SJames Clark deterministic.c:26 53*ccf62a26SJames Clark deterministic.c:9 54*ccf62a26SJames Clark deterministic.c:10 55*ccf62a26SJames Clark deterministic.c:11 56*ccf62a26SJames Clark deterministic.c:30 57*ccf62a26SJames Clark deterministic.c:31 58*ccf62a26SJames Clark deterministic.c:32 59*ccf62a26SJames Clark deterministic.c:16 60*ccf62a26SJames Clark deterministic.c:17 61*ccf62a26SJames Clark deterministic.c:18 62*ccf62a26SJames ClarkEOF 63*ccf62a26SJames Clark 64*ccf62a26SJames Clarkif ! diff -q "$tmpdir/script" "$tmpdir/expected"; then 65*ccf62a26SJames Clark echo "FAIL: line numbers don't match expected: " 66*ccf62a26SJames Clark head -n 100 "$tmpdir/script" 67*ccf62a26SJames Clark cleanup 68*ccf62a26SJames Clark exit 1 69*ccf62a26SJames Clarkfi 70*ccf62a26SJames Clark 71*ccf62a26SJames Clarkcleanup 72*ccf62a26SJames Clarkexit 0 73