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

daemon.sh (10787B)


      1#!/bin/bash
      2# daemon operations
      3# SPDX-License-Identifier: GPL-2.0
      4
      5check_line_first()
      6{
      7	local line=$1
      8	local name=$2
      9	local base=$3
     10	local output=$4
     11	local lock=$5
     12	local up=$6
     13
     14	local line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'`
     15	local line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'`
     16	local line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'`
     17	local line_lock=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'`
     18	local line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'`
     19
     20	if [ "${name}" != "${line_name}" ]; then
     21		echo "FAILED: wrong name"
     22		error=1
     23	fi
     24
     25	if [ "${base}" != "${line_base}" ]; then
     26		echo "FAILED: wrong base"
     27		error=1
     28	fi
     29
     30	if [ "${output}" != "${line_output}" ]; then
     31		echo "FAILED: wrong output"
     32		error=1
     33	fi
     34
     35	if [ "${lock}" != "${line_lock}" ]; then
     36		echo "FAILED: wrong lock"
     37		error=1
     38	fi
     39
     40	if [ "${up}" != "${line_up}" ]; then
     41		echo "FAILED: wrong up"
     42		error=1
     43	fi
     44}
     45
     46check_line_other()
     47{
     48	local line=$1
     49	local name=$2
     50	local run=$3
     51	local base=$4
     52	local output=$5
     53	local control=$6
     54	local ack=$7
     55	local up=$8
     56
     57	local line_name=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $2 }'`
     58	local line_run=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $3 }'`
     59	local line_base=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $4 }'`
     60	local line_output=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $5 }'`
     61	local line_control=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $6 }'`
     62	local line_ack=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $7 }'`
     63	local line_up=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $8 }'`
     64
     65	if [ "${name}" != "${line_name}" ]; then
     66		echo "FAILED: wrong name"
     67		error=1
     68	fi
     69
     70	if [ "${run}" != "${line_run}" ]; then
     71		echo "FAILED: wrong run"
     72		error=1
     73	fi
     74
     75	if [ "${base}" != "${line_base}" ]; then
     76		echo "FAILED: wrong base"
     77		error=1
     78	fi
     79
     80	if [ "${output}" != "${line_output}" ]; then
     81		echo "FAILED: wrong output"
     82		error=1
     83	fi
     84
     85	if [ "${control}" != "${line_control}" ]; then
     86		echo "FAILED: wrong control"
     87		error=1
     88	fi
     89
     90	if [ "${ack}" != "${line_ack}" ]; then
     91		echo "FAILED: wrong ack"
     92		error=1
     93	fi
     94
     95	if [ "${up}" != "${line_up}" ]; then
     96		echo "FAILED: wrong up"
     97		error=1
     98	fi
     99}
    100
    101daemon_exit()
    102{
    103	local config=$1
    104
    105	local line=`perf daemon --config ${config} -x: | head -1`
    106	local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'`
    107
    108	# Reset trap handler.
    109	trap - SIGINT SIGTERM
    110
    111	# stop daemon
    112	perf daemon stop --config ${config}
    113
    114	# ... and wait for the pid to go away
    115	tail --pid=${pid} -f /dev/null
    116}
    117
    118daemon_start()
    119{
    120	local config=$1
    121	local session=$2
    122
    123	perf daemon start --config ${config}
    124
    125	# Clean up daemon if interrupted.
    126	trap "echo 'FAILED: Signal caught'; daemon_exit ${config}; exit 1" SIGINT SIGTERM
    127
    128	# wait for the session to ping
    129	local state="FAIL"
    130	local retries=0
    131	while [ "${state}" != "OK" ]; do
    132		state=`perf daemon ping --config ${config} --session ${session} | awk '{ print $1 }'`
    133		sleep 0.05
    134		retries=$((${retries} +1))
    135		if [ ${retries} -ge 600 ]; then
    136			echo "FAILED: Timeout waiting for daemon to ping"
    137			daemon_exit ${config}
    138			exit 1
    139		fi
    140	done
    141}
    142
    143test_list()
    144{
    145	echo "test daemon list"
    146
    147	local config=$(mktemp /tmp/perf.daemon.config.XXX)
    148	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
    149
    150	cat <<EOF > ${config}
    151[daemon]
    152base=BASE
    153
    154[session-size]
    155run = -e cpu-clock -m 1 sleep 10
    156
    157[session-time]
    158run = -e task-clock -m 1 sleep 10
    159EOF
    160
    161	sed -i -e "s|BASE|${base}|" ${config}
    162
    163	# start daemon
    164	daemon_start ${config} size
    165
    166	# check first line
    167	# pid:daemon:base:base/output:base/lock
    168	local line=`perf daemon --config ${config} -x: | head -1`
    169	check_line_first ${line} daemon ${base} ${base}/output ${base}/lock "0"
    170
    171	# check 1st session
    172	# pid:size:-e cpu-clock:base/size:base/size/output:base/size/control:base/size/ack:0
    173	local line=`perf daemon --config ${config} -x: | head -2 | tail -1`
    174	check_line_other "${line}" size "-e cpu-clock -m 1 sleep 10" ${base}/session-size \
    175			 ${base}/session-size/output ${base}/session-size/control \
    176			 ${base}/session-size/ack "0"
    177
    178	# check 2nd session
    179	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0
    180	local line=`perf daemon --config ${config} -x: | head -3 | tail -1`
    181	check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \
    182			 ${base}/session-time/output ${base}/session-time/control \
    183			 ${base}/session-time/ack "0"
    184
    185	# stop daemon
    186	daemon_exit ${config}
    187
    188	rm -rf ${base}
    189	rm -f ${config}
    190}
    191
    192test_reconfig()
    193{
    194	echo "test daemon reconfig"
    195
    196	local config=$(mktemp /tmp/perf.daemon.config.XXX)
    197	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
    198
    199	# prepare config
    200	cat <<EOF > ${config}
    201[daemon]
    202base=BASE
    203
    204[session-size]
    205run = -e cpu-clock -m 1 sleep 10
    206
    207[session-time]
    208run = -e task-clock -m 1 sleep 10
    209EOF
    210
    211	sed -i -e "s|BASE|${base}|" ${config}
    212
    213	# start daemon
    214	daemon_start ${config} size
    215
    216	# check 2nd session
    217	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0
    218	local line=`perf daemon --config ${config} -x: | head -3 | tail -1`
    219	check_line_other "${line}" time "-e task-clock -m 1 sleep 10" ${base}/session-time \
    220			 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0"
    221	local pid=`echo "${line}" | awk 'BEGIN { FS = ":" } ; { print $1 }'`
    222
    223	# prepare new config
    224	local config_new=${config}.new
    225	cat <<EOF > ${config_new}
    226[daemon]
    227base=BASE
    228
    229[session-size]
    230run = -e cpu-clock -m 1 sleep 10
    231
    232[session-time]
    233run = -e cpu-clock -m 1 sleep 10
    234EOF
    235
    236	# TEST 1 - change config
    237
    238	sed -i -e "s|BASE|${base}|" ${config_new}
    239	cp ${config_new} ${config}
    240
    241	# wait for old session to finish
    242	tail --pid=${pid} -f /dev/null
    243
    244	# wait for new one to start
    245	local state="FAIL"
    246	while [ "${state}" != "OK" ]; do
    247		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
    248	done
    249
    250	# check reconfigured 2nd session
    251	# pid:time:-e task-clock:base/time:base/time/output:base/time/control:base/time/ack:0
    252	local line=`perf daemon --config ${config} -x: | head -3 | tail -1`
    253	check_line_other "${line}" time "-e cpu-clock -m 1 sleep 10" ${base}/session-time \
    254			 ${base}/session-time/output ${base}/session-time/control ${base}/session-time/ack "0"
    255
    256	# TEST 2 - empty config
    257
    258	local config_empty=${config}.empty
    259	cat <<EOF > ${config_empty}
    260[daemon]
    261base=BASE
    262EOF
    263
    264	# change config
    265	sed -i -e "s|BASE|${base}|" ${config_empty}
    266	cp ${config_empty} ${config}
    267
    268	# wait for sessions to finish
    269	local state="OK"
    270	while [ "${state}" != "FAIL" ]; do
    271		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
    272	done
    273
    274	local state="OK"
    275	while [ "${state}" != "FAIL" ]; do
    276		state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`
    277	done
    278
    279	local one=`perf daemon --config ${config} -x: | wc -l`
    280
    281	if [ ${one} -ne "1" ]; then
    282		echo "FAILED: wrong list output"
    283		error=1
    284	fi
    285
    286	# TEST 3 - config again
    287
    288	cp ${config_new} ${config}
    289
    290	# wait for size to start
    291	local state="FAIL"
    292	while [ "${state}" != "OK" ]; do
    293		state=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`
    294	done
    295
    296	# wait for time to start
    297	local state="FAIL"
    298	while [ "${state}" != "OK" ]; do
    299		state=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
    300	done
    301
    302	# stop daemon
    303	daemon_exit ${config}
    304
    305	rm -rf ${base}
    306	rm -f ${config}
    307	rm -f ${config_new}
    308	rm -f ${config_empty}
    309}
    310
    311test_stop()
    312{
    313	echo "test daemon stop"
    314
    315	local config=$(mktemp /tmp/perf.daemon.config.XXX)
    316	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
    317
    318	# prepare config
    319	cat <<EOF > ${config}
    320[daemon]
    321base=BASE
    322
    323[session-size]
    324run = -e cpu-clock -m 1 sleep 10
    325
    326[session-time]
    327run = -e task-clock -m 1 sleep 10
    328EOF
    329
    330	sed -i -e "s|BASE|${base}|" ${config}
    331
    332	# start daemon
    333	daemon_start ${config} size
    334
    335	local pid_size=`perf daemon --config ${config} -x: | head -2 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'`
    336	local pid_time=`perf daemon --config ${config} -x: | head -3 | tail -1 | awk 'BEGIN { FS = ":" } ; { print $1 }'`
    337
    338	# check that sessions are running
    339	if [ ! -d "/proc/${pid_size}" ]; then
    340		echo "FAILED: session size not up"
    341	fi
    342
    343	if [ ! -d "/proc/${pid_time}" ]; then
    344		echo "FAILED: session time not up"
    345	fi
    346
    347	# stop daemon
    348	daemon_exit ${config}
    349
    350	# check that sessions are gone
    351	if [ -d "/proc/${pid_size}" ]; then
    352		echo "FAILED: session size still up"
    353	fi
    354
    355	if [ -d "/proc/${pid_time}" ]; then
    356		echo "FAILED: session time still up"
    357	fi
    358
    359	rm -rf ${base}
    360	rm -f ${config}
    361}
    362
    363test_signal()
    364{
    365	echo "test daemon signal"
    366
    367	local config=$(mktemp /tmp/perf.daemon.config.XXX)
    368	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
    369
    370	# prepare config
    371	cat <<EOF > ${config}
    372[daemon]
    373base=BASE
    374
    375[session-test]
    376run = -e cpu-clock --switch-output -m 1 sleep 10
    377EOF
    378
    379	sed -i -e "s|BASE|${base}|" ${config}
    380
    381	# start daemon
    382	daemon_start ${config} test
    383
    384	# send 2 signals
    385	perf daemon signal --config ${config} --session test
    386	perf daemon signal --config ${config}
    387
    388	# stop daemon
    389	daemon_exit ${config}
    390
    391	# count is 2 perf.data for signals and 1 for perf record finished
    392	count=`ls ${base}/session-test/ | grep perf.data | wc -l`
    393	if [ ${count} -ne 3 ]; then
    394		error=1
    395		echo "FAILED: perf data no generated"
    396	fi
    397
    398	rm -rf ${base}
    399	rm -f ${config}
    400}
    401
    402test_ping()
    403{
    404	echo "test daemon ping"
    405
    406	local config=$(mktemp /tmp/perf.daemon.config.XXX)
    407	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
    408
    409	# prepare config
    410	cat <<EOF > ${config}
    411[daemon]
    412base=BASE
    413
    414[session-size]
    415run = -e cpu-clock -m 1 sleep 10
    416
    417[session-time]
    418run = -e task-clock -m 1 sleep 10
    419EOF
    420
    421	sed -i -e "s|BASE|${base}|" ${config}
    422
    423	# start daemon
    424	daemon_start ${config} size
    425
    426	size=`perf daemon ping --config ${config} --session size | awk '{ print $1 }'`
    427	type=`perf daemon ping --config ${config} --session time | awk '{ print $1 }'`
    428
    429	if [ ${size} != "OK" -o ${type} != "OK" ]; then
    430		error=1
    431		echo "FAILED: daemon ping failed"
    432	fi
    433
    434	# stop daemon
    435	daemon_exit ${config}
    436
    437	rm -rf ${base}
    438	rm -f ${config}
    439}
    440
    441test_lock()
    442{
    443	echo "test daemon lock"
    444
    445	local config=$(mktemp /tmp/perf.daemon.config.XXX)
    446	local base=$(mktemp -d /tmp/perf.daemon.base.XXX)
    447
    448	# prepare config
    449	cat <<EOF > ${config}
    450[daemon]
    451base=BASE
    452
    453[session-size]
    454run = -e cpu-clock -m 1 sleep 10
    455EOF
    456
    457	sed -i -e "s|BASE|${base}|" ${config}
    458
    459	# start daemon
    460	daemon_start ${config} size
    461
    462	# start second daemon over the same config/base
    463	failed=`perf daemon start --config ${config} 2>&1 | awk '{ print $1 }'`
    464
    465	# check that we failed properly
    466	if [ ${failed} != "failed:" ]; then
    467		error=1
    468		echo "FAILED: daemon lock failed"
    469	fi
    470
    471	# stop daemon
    472	daemon_exit ${config}
    473
    474	rm -rf ${base}
    475	rm -f ${config}
    476}
    477
    478error=0
    479
    480test_list
    481test_reconfig
    482test_stop
    483test_signal
    484test_ping
    485test_lock
    486
    487exit ${error}