xref: /linux/tools/perf/tests/shell/coresight/deterministic.sh (revision efe86f088f48f18c27b648e5724048947f3b7fb4)
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