cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

test_arm_callgraph_fp.sh (1468B)


      1#!/bin/sh
      2# Check Arm64 callgraphs are complete in fp mode
      3# SPDX-License-Identifier: GPL-2.0
      4
      5lscpu | grep -q "aarch64" || exit 2
      6
      7if ! [ -x "$(command -v cc)" ]; then
      8	echo "failed: no compiler, install gcc"
      9	exit 2
     10fi
     11
     12PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
     13TEST_PROGRAM_SOURCE=$(mktemp /tmp/test_program.XXXXX.c)
     14TEST_PROGRAM=$(mktemp /tmp/test_program.XXXXX)
     15
     16cleanup_files()
     17{
     18	rm -f $PERF_DATA
     19	rm -f $TEST_PROGRAM_SOURCE
     20	rm -f $TEST_PROGRAM
     21}
     22
     23trap cleanup_files exit term int
     24
     25cat << EOF > $TEST_PROGRAM_SOURCE
     26int a = 0;
     27void leaf(void) {
     28  for (;;)
     29    a += a;
     30}
     31void parent(void) {
     32  leaf();
     33}
     34int main(void) {
     35  parent();
     36  return 0;
     37}
     38EOF
     39
     40echo " + Compiling test program ($TEST_PROGRAM)..."
     41
     42CFLAGS="-g -O0 -fno-inline -fno-omit-frame-pointer"
     43cc $CFLAGS $TEST_PROGRAM_SOURCE -o $TEST_PROGRAM || exit 1
     44
     45# Add a 1 second delay to skip samples that are not in the leaf() function
     46perf record -o $PERF_DATA --call-graph fp -e cycles//u -D 1000 --user-callchains -- $TEST_PROGRAM 2> /dev/null &
     47PID=$!
     48
     49echo " + Recording (PID=$PID)..."
     50sleep 2
     51echo " + Stopping perf-record..."
     52
     53kill $PID
     54wait $PID
     55
     56# expected perf-script output:
     57#
     58# program
     59# 	728 leaf
     60# 	753 parent
     61# 	76c main
     62# ...
     63
     64perf script -i $PERF_DATA -F comm,ip,sym | head -n4
     65perf script -i $PERF_DATA -F comm,ip,sym | head -n4 | \
     66	awk '{ if ($2 != "") sym[i++] = $2 } END { if (sym[0] != "leaf" ||
     67						       sym[1] != "parent" ||
     68						       sym[2] != "main") exit 1 }'