aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tools/testing/selftests/rcutorture/bin/kvm-transform.sh
blob: 75a2610a27f3771265ea8a3960f21ab9762ce857 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0+
#
# Transform a qemu-cmd file to allow reuse.
#
# Usage: kvm-transform.sh bzImage console.log jitter_dir seconds [ bootargs ] < qemu-cmd-in > qemu-cmd-out
#
#	bzImage: Kernel and initrd from the same prior kvm.sh run.
#	console.log: File into which to place console output.
#	jitter_dir: Jitter directory for TORTURE_JITTER_START and
#		TORTURE_JITTER_STOP environment variables.
#	seconds: Run duaration for *.shutdown_secs module parameter.
#	bootargs: New kernel boot parameters.  Beware of Robert Tables.
#
# The original qemu-cmd file is provided on standard input.
# The transformed qemu-cmd file is on standard output.
# The transformation assumes that the qemu command is confined to a
# single line.  It also assumes no whitespace in filenames.
#
# Copyright (C) 2020 Facebook, Inc.
#
# Authors: Paul E. McKenney <paulmck@kernel.org>

T=`mktemp -d /tmp/kvm-transform.sh.XXXXXXXXXX`
trap 'rm -rf $T' 0 2

image="$1"
if test -z "$image"
then
	echo Need kernel image file.
	exit 1
fi
consolelog="$2"
if test -z "$consolelog"
then
	echo "Need console log file name."
	exit 1
fi
jitter_dir="$3"
if test -z "$jitter_dir" || ! test -d "$jitter_dir"
then
	echo "Need valid jitter directory: '$jitter_dir'"
	exit 1
fi
seconds="$4"
if test -n "$seconds" && echo $seconds | grep -q '[^0-9]'
then
	echo "Invalid duration, should be numeric in seconds: '$seconds'"
	exit 1
fi
bootargs="$5"

# Build awk program.
echo "BEGIN {" > $T/bootarg.awk
echo $bootargs | tr -s ' ' '\012' |
	awk -v dq='"' '/./ { print "\tbootarg[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
echo $bootargs | tr -s ' ' '\012' | sed -e 's/=.*$//' |
	awk -v dq='"' '/./ { print "\tbootpar[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
cat >> $T/bootarg.awk << '___EOF___'
}

/^# seconds=/ {
	if (seconds == "")
		print $0;
	else
		print "# seconds=" seconds;
	next;
}

/^# TORTURE_JITTER_START=/ {
	print "# TORTURE_JITTER_START=\". jitterstart.sh " $4 " " jitter_dir " " $6 " " $7;
	next;
}

/^# TORTURE_JITTER_STOP=/ {
	print "# TORTURE_JITTER_STOP=\". jitterstop.sh " " " jitter_dir " " $5;
	next;
}

/^#/ {
	print $0;
	next;
}

{
	line = "";
	for (i = 1; i <= NF; i++) {
		if (line == "") {
			line = $i;
		} else {
			line = line " " $i;
		}
		if ($i == "-serial") {
			i++;
			line = line " file:" consolelog;
		} else if ($i == "-kernel") {
			i++;
			line = line " " image;
		} else if ($i == "-append") {
			for (i++; i <= NF; i++) {
				arg = $i;
				lq = "";
				rq = "";
				if ("" seconds != "" && $i ~ /\.shutdown_secs=[0-9]*$/)
					sub(/[0-9]*$/, seconds, arg);
				if (arg ~ /^"/) {
					lq = substr(arg, 1, 1);
					arg  = substr(arg, 2);
				}
				if (arg ~ /"$/) {
					rq = substr(arg, length($i), 1);
					arg = substr(arg, 1, length($i) - 1);
				}
				par = arg;
				gsub(/=.*$/, "", par);
				j = 1;
				while (bootpar[j] != "") {
					if (bootpar[j] == par) {
						arg = "";
						break;
					}
					j++;
				}
				if (line == "")
					line = lq arg;
				else
					line = line " " lq arg;
			}
			for (j in bootarg)
				line = line " " bootarg[j];
			line = line rq;
		}
	}
	print line;
}
___EOF___

awk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
    -v seconds="$seconds" -f $T/bootarg.awk