162306a36Sopenharmony_ci#!/usr/bin/env bash
262306a36Sopenharmony_ci
362306a36Sopenharmony_ciset -euo pipefail
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciTIMEOUT=10
662306a36Sopenharmony_ci
762306a36Sopenharmony_cifunction do_one
862306a36Sopenharmony_ci{
962306a36Sopenharmony_ci    local mitigation="$1"
1062306a36Sopenharmony_ci    local orig
1162306a36Sopenharmony_ci    local start
1262306a36Sopenharmony_ci    local now
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci    orig=$(cat "$mitigation")
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci    start=$(date +%s)
1762306a36Sopenharmony_ci    now=$start
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci    while [[ $((now-start)) -lt "$TIMEOUT" ]]
2062306a36Sopenharmony_ci    do
2162306a36Sopenharmony_ci        echo 0 > "$mitigation"
2262306a36Sopenharmony_ci        echo 1 > "$mitigation"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci        now=$(date +%s)
2562306a36Sopenharmony_ci    done
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci    echo "$orig" > "$mitigation"
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_circ=0
3162306a36Sopenharmony_cicd /sys/kernel/debug/powerpc || rc=1
3262306a36Sopenharmony_ciif [[ "$rc" -ne 0 ]]; then
3362306a36Sopenharmony_ci    echo "Error: couldn't cd to /sys/kernel/debug/powerpc" >&2
3462306a36Sopenharmony_ci    exit 1
3562306a36Sopenharmony_cifi
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_citainted=$(cat /proc/sys/kernel/tainted)
3862306a36Sopenharmony_ciif [[ "$tainted" -ne 0 ]]; then
3962306a36Sopenharmony_ci    echo "Error: kernel already tainted!" >&2
4062306a36Sopenharmony_ci    exit 1
4162306a36Sopenharmony_cifi
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cimitigations="barrier_nospec stf_barrier count_cache_flush rfi_flush entry_flush uaccess_flush"
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cifor m in $mitigations
4662306a36Sopenharmony_cido
4762306a36Sopenharmony_ci    if [[ -f /sys/kernel/debug/powerpc/$m ]]
4862306a36Sopenharmony_ci    then
4962306a36Sopenharmony_ci        do_one "$m" &
5062306a36Sopenharmony_ci    fi
5162306a36Sopenharmony_cidone
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciecho "Spawned threads enabling/disabling mitigations ..."
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ciif stress-ng > /dev/null 2>&1; then
5662306a36Sopenharmony_ci    stress="stress-ng"
5762306a36Sopenharmony_cielif stress > /dev/null 2>&1; then
5862306a36Sopenharmony_ci    stress="stress"
5962306a36Sopenharmony_cielse
6062306a36Sopenharmony_ci    stress=""
6162306a36Sopenharmony_cifi
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciif [[ -n "$stress" ]]; then
6462306a36Sopenharmony_ci    "$stress" -m "$(nproc)" -t "$TIMEOUT" &
6562306a36Sopenharmony_ci    echo "Spawned VM stressors ..."
6662306a36Sopenharmony_cifi
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciecho "Waiting for timeout ..."
6962306a36Sopenharmony_ciwait
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_citainted=$(cat /proc/sys/kernel/tainted)
7262306a36Sopenharmony_ciif [[ "$tainted" -ne 0 ]]; then
7362306a36Sopenharmony_ci    echo "Error: kernel became tainted!" >&2
7462306a36Sopenharmony_ci    exit 1
7562306a36Sopenharmony_cifi
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciecho "OK"
7862306a36Sopenharmony_ciexit 0
79