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_spe_fork.sh (1876B)


      1#!/bin/sh
      2# Check Arm SPE doesn't hang when there are forks
      3
      4# SPDX-License-Identifier: GPL-2.0
      5# German Gomez <german.gomez@arm.com>, 2022
      6
      7skip_if_no_arm_spe_event() {
      8	perf list | egrep -q 'arm_spe_[0-9]+//' && return 0
      9	return 2
     10}
     11
     12skip_if_no_arm_spe_event || exit 2
     13
     14# skip if there's no compiler
     15if ! [ -x "$(command -v cc)" ]; then
     16	echo "failed: no compiler, install gcc"
     17	exit 2
     18fi
     19
     20TEST_PROGRAM_SOURCE=$(mktemp /tmp/__perf_test.program.XXXXX.c)
     21TEST_PROGRAM=$(mktemp /tmp/__perf_test.program.XXXXX)
     22PERF_DATA=$(mktemp /tmp/__perf_test.perf.data.XXXXX)
     23PERF_RECORD_LOG=$(mktemp /tmp/__perf_test.log.XXXXX)
     24
     25cleanup_files()
     26{
     27	echo "Cleaning up files..."
     28	rm -f ${PERF_RECORD_LOG}
     29	rm -f ${PERF_DATA}
     30	rm -f ${TEST_PROGRAM_SOURCE}
     31	rm -f ${TEST_PROGRAM}
     32}
     33
     34trap cleanup_files exit term int
     35
     36# compile test program
     37cat << EOF > $TEST_PROGRAM_SOURCE
     38#include <math.h>
     39#include <stdio.h>
     40#include <stdlib.h>
     41#include <unistd.h>
     42#include <sys/wait.h>
     43
     44int workload() {
     45  while (1)
     46    sqrt(rand());
     47  return 0;
     48}
     49
     50int main() {
     51  switch (fork()) {
     52    case 0:
     53      return workload();
     54    case -1:
     55      return 1;
     56    default:
     57      wait(NULL);
     58  }
     59  return 0;
     60}
     61EOF
     62
     63echo "Compiling test program..."
     64CFLAGS="-lm"
     65cc $TEST_PROGRAM_SOURCE $CFLAGS -o $TEST_PROGRAM || exit 1
     66
     67echo "Recording workload..."
     68perf record -o ${PERF_DATA} -e arm_spe/period=65536/ -vvv -- $TEST_PROGRAM > ${PERF_RECORD_LOG} 2>&1 &
     69PERFPID=$!
     70
     71# Check if perf hangs by checking the perf-record logs.
     72sleep 1
     73log0=$(wc -l $PERF_RECORD_LOG)
     74echo Log lines = $log0
     75sleep 1
     76log1=$(wc -l $PERF_RECORD_LOG)
     77echo Log lines after 1 second = $log1
     78
     79kill $PERFPID
     80wait $PERFPID
     81# test program may leave an orphan process running the workload
     82killall $(basename $TEST_PROGRAM)
     83
     84if [ "$log0" = "$log1" ];
     85then
     86        echo "SPE hang test: FAIL"
     87        exit 1
     88else
     89        echo "SPE hang test: PASS"
     90fi
     91
     92exit 0