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

cpufreq.sh (4654B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3
      4# protect against multiple inclusion
      5if [ $FILE_CPUFREQ ]; then
      6	return 0
      7else
      8	FILE_CPUFREQ=DONE
      9fi
     10
     11source cpu.sh
     12
     13
     14# $1: cpu
     15cpu_should_have_cpufreq_directory()
     16{
     17	if [ ! -d $CPUROOT/$1/cpufreq ]; then
     18		printf "Warning: No cpufreq directory present for $1\n"
     19	fi
     20}
     21
     22cpu_should_not_have_cpufreq_directory()
     23{
     24	if [ -d $CPUROOT/$1/cpufreq ]; then
     25		printf "Warning: cpufreq directory present for $1\n"
     26	fi
     27}
     28
     29for_each_policy()
     30{
     31	policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
     32	for policy in $policies; do
     33		$@ $policy
     34	done
     35}
     36
     37for_each_policy_concurrent()
     38{
     39	policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
     40	for policy in $policies; do
     41		$@ $policy &
     42	done
     43}
     44
     45# $1: Path
     46read_cpufreq_files_in_dir()
     47{
     48	local files=`ls $1`
     49
     50	printf "Printing directory: $1\n\n"
     51
     52	for file in $files; do
     53		if [ -f $1/$file ]; then
     54			printf "$file:"
     55			cat $1/$file
     56		else
     57			printf "\n"
     58			read_cpufreq_files_in_dir "$1/$file"
     59		fi
     60	done
     61	printf "\n"
     62}
     63
     64
     65read_all_cpufreq_files()
     66{
     67	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
     68
     69	read_cpufreq_files_in_dir $CPUFREQROOT
     70
     71	printf "%s\n\n" "------------------------------------------------"
     72}
     73
     74
     75# UPDATE CPUFREQ FILES
     76
     77# $1: directory path
     78update_cpufreq_files_in_dir()
     79{
     80	local files=`ls $1`
     81
     82	printf "Updating directory: $1\n\n"
     83
     84	for file in $files; do
     85		if [ -f $1/$file ]; then
     86			# file is writable ?
     87			local wfile=$(ls -l $1/$file | awk '$1 ~ /^.*w.*/ { print $NF; }')
     88
     89			if [ ! -z $wfile ]; then
     90				# scaling_setspeed is a special file and we
     91				# should skip updating it
     92				if [ $file != "scaling_setspeed" ]; then
     93					local val=$(cat $1/$file)
     94					printf "Writing $val to: $file\n"
     95					echo $val > $1/$file
     96				fi
     97			fi
     98		else
     99			printf "\n"
    100			update_cpufreq_files_in_dir "$1/$file"
    101		fi
    102	done
    103
    104	printf "\n"
    105}
    106
    107# Update all writable files with their existing values
    108update_all_cpufreq_files()
    109{
    110	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
    111
    112	update_cpufreq_files_in_dir $CPUFREQROOT
    113
    114	printf "%s\n\n" "------------------------------------------------"
    115}
    116
    117
    118# CHANGE CPU FREQUENCIES
    119
    120# $1: policy
    121find_current_freq()
    122{
    123	cat $CPUFREQROOT/$1/scaling_cur_freq
    124}
    125
    126# $1: policy
    127# $2: frequency
    128set_cpu_frequency()
    129{
    130	printf "Change frequency for $1 to $2\n"
    131	echo $2 > $CPUFREQROOT/$1/scaling_setspeed
    132}
    133
    134# $1: policy
    135test_all_frequencies()
    136{
    137	local filepath="$CPUFREQROOT/$1"
    138
    139	backup_governor $1
    140
    141	local found=$(switch_governor $1 "userspace")
    142	if [ $found = 1 ]; then
    143		printf "${FUNCNAME[0]}: userspace governor not available for: $1\n"
    144		return;
    145	fi
    146
    147	printf "Switched governor for $1 to userspace\n\n"
    148
    149	local freqs=$(cat $filepath/scaling_available_frequencies)
    150	printf "Available frequencies for $1: $freqs\n\n"
    151
    152	# Set all frequencies one-by-one
    153	for freq in $freqs; do
    154		set_cpu_frequency $1 $freq
    155	done
    156
    157	printf "\n"
    158
    159	restore_governor $1
    160}
    161
    162# $1: loop count
    163shuffle_frequency_for_all_cpus()
    164{
    165	printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"
    166
    167	for i in `seq 1 $1`; do
    168		for_each_policy test_all_frequencies
    169	done
    170	printf "\n%s\n\n" "------------------------------------------------"
    171}
    172
    173# Basic cpufreq tests
    174cpufreq_basic_tests()
    175{
    176	printf "*** RUNNING CPUFREQ SANITY TESTS ***\n"
    177	printf "====================================\n\n"
    178
    179	count=$(count_cpufreq_managed_cpus)
    180	if [ $count = 0 ]; then
    181		printf "No cpu is managed by cpufreq core, exiting\n"
    182		exit;
    183	else
    184		printf "CPUFreq manages: $count CPUs\n\n"
    185	fi
    186
    187	# Detect & print which CPUs are not managed by cpufreq
    188	print_unmanaged_cpus
    189
    190	# read/update all cpufreq files
    191	read_all_cpufreq_files
    192	update_all_cpufreq_files
    193
    194	# hotplug cpus
    195	reboot_cpus 5
    196
    197	# Test all frequencies
    198	shuffle_frequency_for_all_cpus 2
    199
    200	# Test all governors
    201	shuffle_governors_for_all_cpus 1
    202}
    203
    204# Suspend/resume
    205# $1: "suspend" or "hibernate", $2: loop count
    206do_suspend()
    207{
    208	printf "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **\n\n"
    209
    210	# Is the directory available
    211	if [ ! -d $SYSFS/power/ -o ! -f $SYSFS/power/state ]; then
    212		printf "$SYSFS/power/state not available\n"
    213		return 1
    214	fi
    215
    216	if [ $1 = "suspend" ]; then
    217		filename="mem"
    218	elif [ $1 = "hibernate" ]; then
    219		filename="disk"
    220	else
    221		printf "$1 is not a valid option\n"
    222		return 1
    223	fi
    224
    225	if [ -n $filename ]; then
    226		present=$(cat $SYSFS/power/state | grep $filename)
    227
    228		if [ -z "$present" ]; then
    229			printf "Tried to $1 but $filename isn't present in $SYSFS/power/state\n"
    230			return 1;
    231		fi
    232
    233		for i in `seq 1 $2`; do
    234			printf "Starting $1\n"
    235			echo $filename > $SYSFS/power/state
    236			printf "Came out of $1\n"
    237
    238			printf "Do basic tests after finishing $1 to verify cpufreq state\n\n"
    239			cpufreq_basic_tests
    240		done
    241	fi
    242}