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

failcmd.sh (4304B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0
      3#
      4# NAME
      5#	failcmd.sh - run a command with injecting slab/page allocation failures
      6#
      7# SYNOPSIS
      8#	failcmd.sh --help
      9#	failcmd.sh [<options>] command [arguments]
     10#
     11# DESCRIPTION
     12#	Run command with injecting slab/page allocation failures by fault
     13#	injection.
     14#
     15#	NOTE: you need to run this script as root.
     16#
     17
     18usage()
     19{
     20	cat >&2 <<EOF
     21Usage: $0 [options] command [arguments]
     22
     23OPTIONS
     24	-p percent
     25	--probability=percent
     26		likelihood of failure injection, in percent.
     27		Default value is 1
     28
     29	-t value
     30	--times=value
     31		specifies how many times failures may happen at most.
     32		Default value is 1
     33
     34	--oom-kill-allocating-task=value
     35		set /proc/sys/vm/oom_kill_allocating_task to specified value
     36		before running the command.
     37		Default value is 1
     38
     39	-h, --help
     40		Display a usage message and exit
     41
     42	--interval=value, --space=value, --verbose=value, --task-filter=value,
     43	--stacktrace-depth=value, --require-start=value, --require-end=value,
     44	--reject-start=value, --reject-end=value, --ignore-gfp-wait=value
     45		See Documentation/fault-injection/fault-injection.rst for more
     46		information
     47
     48	failslab options:
     49	--cache-filter=value
     50
     51	fail_page_alloc options:
     52	--ignore-gfp-highmem=value, --min-order=value
     53
     54ENVIRONMENT
     55	FAILCMD_TYPE
     56		The following values for FAILCMD_TYPE are recognized:
     57
     58		failslab
     59			inject slab allocation failures
     60		fail_page_alloc
     61			inject page allocation failures
     62
     63		If FAILCMD_TYPE is not defined, then failslab is used.
     64EOF
     65}
     66
     67if [ $UID != 0 ]; then
     68	echo must be run as root >&2
     69	exit 1
     70fi
     71
     72DEBUGFS=`mount -t debugfs | head -1 | awk '{ print $3}'`
     73
     74if [ ! -d "$DEBUGFS" ]; then
     75	echo debugfs is not mounted >&2
     76	exit 1
     77fi
     78
     79FAILCMD_TYPE=${FAILCMD_TYPE:-failslab}
     80FAULTATTR=$DEBUGFS/$FAILCMD_TYPE
     81
     82if [ ! -d $FAULTATTR ]; then
     83	echo $FAILCMD_TYPE is not available >&2
     84	exit 1
     85fi
     86
     87LONGOPTS=probability:,interval:,times:,space:,verbose:,task-filter:
     88LONGOPTS=$LONGOPTS,stacktrace-depth:,require-start:,require-end:
     89LONGOPTS=$LONGOPTS,reject-start:,reject-end:,oom-kill-allocating-task:,help
     90
     91if [ $FAILCMD_TYPE = failslab ]; then
     92	LONGOPTS=$LONGOPTS,ignore-gfp-wait:,cache-filter:
     93elif [ $FAILCMD_TYPE = fail_page_alloc ]; then
     94	LONGOPTS=$LONGOPTS,ignore-gfp-wait:,ignore-gfp-highmem:,min-order:
     95fi
     96
     97TEMP=`getopt -o p:i:t:s:v:h --long $LONGOPTS -n 'failcmd.sh' -- "$@"`
     98
     99if [ $? != 0 ]; then
    100	usage
    101	exit 1
    102fi
    103
    104eval set -- "$TEMP"
    105
    106fault_attr_default()
    107{
    108	echo N > $FAULTATTR/task-filter
    109	echo 0 > $FAULTATTR/probability
    110	echo 1 > $FAULTATTR/times
    111}
    112
    113fault_attr_default
    114
    115oom_kill_allocating_task_saved=`cat /proc/sys/vm/oom_kill_allocating_task`
    116
    117restore_values()
    118{
    119	fault_attr_default
    120	echo $oom_kill_allocating_task_saved \
    121		> /proc/sys/vm/oom_kill_allocating_task
    122}
    123
    124#
    125# Default options
    126#
    127declare -i oom_kill_allocating_task=1
    128declare task_filter=Y
    129declare -i probability=1
    130declare -i times=1
    131
    132while true; do
    133	case "$1" in
    134	-p|--probability)
    135		probability=$2
    136		shift 2
    137		;;
    138	-i|--interval)
    139		echo $2 > $FAULTATTR/interval
    140		shift 2
    141		;;
    142	-t|--times)
    143		times=$2
    144		shift 2
    145		;;
    146	-s|--space)
    147		echo $2 > $FAULTATTR/space
    148		shift 2
    149		;;
    150	-v|--verbose)
    151		echo $2 > $FAULTATTR/verbose
    152		shift 2
    153		;;
    154	--task-filter)
    155		task_filter=$2
    156		shift 2
    157		;;
    158	--stacktrace-depth)
    159		echo $2 > $FAULTATTR/stacktrace-depth
    160		shift 2
    161		;;
    162	--require-start)
    163		echo $2 > $FAULTATTR/require-start
    164		shift 2
    165		;;
    166	--require-end)
    167		echo $2 > $FAULTATTR/require-end
    168		shift 2
    169		;;
    170	--reject-start)
    171		echo $2 > $FAULTATTR/reject-start
    172		shift 2
    173		;;
    174	--reject-end)
    175		echo $2 > $FAULTATTR/reject-end
    176		shift 2
    177		;;
    178	--oom-kill-allocating-task)
    179		oom_kill_allocating_task=$2
    180		shift 2
    181		;;
    182	--ignore-gfp-wait)
    183		echo $2 > $FAULTATTR/ignore-gfp-wait
    184		shift 2
    185		;;
    186	--cache-filter)
    187		echo $2 > $FAULTATTR/cache_filter
    188		shift 2
    189		;;
    190	--ignore-gfp-highmem)
    191		echo $2 > $FAULTATTR/ignore-gfp-highmem
    192		shift 2
    193		;;
    194	--min-order)
    195		echo $2 > $FAULTATTR/min-order
    196		shift 2
    197		;;
    198	-h|--help)
    199		usage
    200		exit 0
    201		shift
    202		;;
    203	--)
    204		shift
    205		break
    206		;;
    207	esac
    208done
    209
    210[ -z "$1" ] && exit 0
    211
    212echo $oom_kill_allocating_task > /proc/sys/vm/oom_kill_allocating_task
    213echo $task_filter > $FAULTATTR/task-filter
    214echo $probability > $FAULTATTR/probability
    215echo $times > $FAULTATTR/times
    216
    217trap "restore_values" SIGINT SIGTERM EXIT
    218
    219cmd="echo 1 > /proc/self/make-it-fail && exec $@"
    220bash -c "$cmd"