1#!/bin/sh
2# Miscellaneous Intel PT testing
3# SPDX-License-Identifier: GPL-2.0
4
5set -e
6
7# Skip if no Intel PT
8perf list | grep -q 'intel_pt//' || exit 2
9
10skip_cnt=0
11ok_cnt=0
12err_cnt=0
13
14temp_dir=$(mktemp -d /tmp/perf-test-intel-pt-sh.XXXXXXXXXX)
15
16tmpfile="${temp_dir}/tmp-perf.data"
17perfdatafile="${temp_dir}/test-perf.data"
18
19cleanup()
20{
21	trap - EXIT TERM INT
22	sane=$(echo "${temp_dir}" | cut -b 1-26)
23	if [ "${sane}" = "/tmp/perf-test-intel-pt-sh" ] ; then
24		echo "--- Cleaning up ---"
25		rm -f "${temp_dir}/"*
26		rmdir "${temp_dir}"
27	fi
28}
29
30trap_cleanup()
31{
32	cleanup
33	exit 1
34}
35
36trap trap_cleanup EXIT TERM INT
37
38can_cpu_wide()
39{
40	perf record -o ${tmpfile} -B -N --no-bpf-event -e dummy:u -C $1 true >/dev/null 2>&1 || return 2
41	return 0
42}
43
44test_system_wide_side_band()
45{
46	# Need CPU 0 and CPU 1
47	can_cpu_wide 0 || return $?
48	can_cpu_wide 1 || return $?
49
50	# Record on CPU 0 a task running on CPU 1
51	perf record -B -N --no-bpf-event -o ${perfdatafile} -e intel_pt//u -C 0 -- taskset --cpu-list 1 uname
52
53	# Should get MMAP events from CPU 1 because they can be needed to decode
54	mmap_cnt=`perf script -i ${perfdatafile} --no-itrace --show-mmap-events -C 1 2>/dev/null | grep MMAP | wc -l`
55
56	if [ ${mmap_cnt} -gt 0 ] ; then
57		return 0
58	fi
59
60	echo "Failed to record MMAP events on CPU 1 when tracing CPU 0"
61	return 1
62}
63
64count_result()
65{
66	if [ $1 -eq 2 ] ; then
67		skip_cnt=$((skip_cnt + 1))
68		return
69	fi
70	if [ $1 -eq 0 ] ; then
71		ok_cnt=$((ok_cnt + 1))
72		return
73	fi
74	err_cnt=$((err_cnt + 1))
75}
76
77test_system_wide_side_band
78
79count_result $?
80
81cleanup
82
83if [ ${err_cnt} -gt 0 ] ; then
84	exit 1
85fi
86
87if [ ${ok_cnt} -gt 0 ] ; then
88	exit 0
89fi
90
91exit 2
92