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