Skip to content

Commit

Permalink
perf test: cs-etm: Test Coresight disassembly script
Browse files Browse the repository at this point in the history
Run a few samples through the disassembly script and check to see that
at least one branch instruction is printed.

Signed-off-by: James Clark <james.clark@linaro.org>
Reviewed-by: Leo Yan <leo.yan@arm.com>
Tested-by: Ganapatrao Kulkarni <gankulkarni@os.amperecomputing.com>
Cc: Ben Gainey <ben.gainey@arm.com>
Cc: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Ruidong Tian <tianruidong@linux.alibaba.com>
Cc: Leo Yan <leo.yan@linux.dev>
Cc: Benjamin Gray <bgray@linux.ibm.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: coresight@lists.linaro.org
Cc: John Garry <john.g.garry@oracle.com>
Cc: scclevenger@os.amperecomputing.com
Link: https://lore.kernel.org/r/20240916135743.1490403-8-james.clark@linaro.org
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
  • Loading branch information
James Clark authored and Namhyung Kim committed Sep 24, 2024
1 parent 66dd3b5 commit eb0a59e
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions tools/perf/tests/shell/test_arm_coresight_disasm.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/bin/sh
# Check Arm CoreSight disassembly script completes without errors
# SPDX-License-Identifier: GPL-2.0

# The disassembly script reconstructs ranges of instructions and gives these to objdump to
# decode. objdump doesn't like ranges that go backwards, but these are a good indication
# that decoding has gone wrong either in OpenCSD, Perf or in the range reconstruction in
# the script. Test all 3 parts are working correctly by running the script.

skip_if_no_cs_etm_event() {
perf list | grep -q 'cs_etm//' && return 0

# cs_etm event doesn't exist
return 2
}

skip_if_no_cs_etm_event || exit 2

# Assume an error unless we reach the very end
set -e
glb_err=1

perfdata_dir=$(mktemp -d /tmp/__perf_test.perf.data.XXXXX)
perfdata=${perfdata_dir}/perf.data
file=$(mktemp /tmp/temporary_file.XXXXX)
# Relative path works whether it's installed or running from repo
script_path=$(dirname "$0")/../../scripts/python/arm-cs-trace-disasm.py

cleanup_files()
{
set +e
rm -rf ${perfdata_dir}
rm -f ${file}
trap - EXIT TERM INT
exit $glb_err
}

trap cleanup_files EXIT TERM INT

# Ranges start and end on branches, so check for some likely branch instructions
sep="\s\|\s"
branch_search="\sbl${sep}b${sep}b.ne${sep}b.eq${sep}cbz\s"

## Test kernel ##
if [ -e /proc/kcore ]; then
echo "Testing kernel disassembly"
perf record -o ${perfdata} -e cs_etm//k --kcore -- touch $file > /dev/null 2>&1
perf script -i ${perfdata} -s python:${script_path} -- \
-d --stop-sample=30 2> /dev/null > ${file}
grep -q -e ${branch_search} ${file}
echo "Found kernel branches"
else
# kcore is required for correct kernel decode due to runtime code patching
echo "No kcore, skipping kernel test"
fi

## Test user ##
echo "Testing userspace disassembly"
perf record -o ${perfdata} -e cs_etm//u -- touch $file > /dev/null 2>&1
perf script -i ${perfdata} -s python:${script_path} -- \
-d --stop-sample=30 2> /dev/null > ${file}
grep -q -e ${branch_search} ${file}
echo "Found userspace branches"

glb_err=0

0 comments on commit eb0a59e

Please sign in to comment.