xref: /openbmc/linux/tools/testing/selftests/rcutorture/bin/kvm-transform.sh (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
106efa9b4SPaul E. McKenney#!/bin/bash
206efa9b4SPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+
306efa9b4SPaul E. McKenney#
406efa9b4SPaul E. McKenney# Transform a qemu-cmd file to allow reuse.
506efa9b4SPaul E. McKenney#
6*50527f7cSPaul E. McKenney# Usage: kvm-transform.sh bzImage console.log jitter_dir seconds [ bootargs ] < qemu-cmd-in > qemu-cmd-out
706efa9b4SPaul E. McKenney#
806efa9b4SPaul E. McKenney#	bzImage: Kernel and initrd from the same prior kvm.sh run.
906efa9b4SPaul E. McKenney#	console.log: File into which to place console output.
10*50527f7cSPaul E. McKenney#	jitter_dir: Jitter directory for TORTURE_JITTER_START and
11*50527f7cSPaul E. McKenney#		TORTURE_JITTER_STOP environment variables.
12*50527f7cSPaul E. McKenney#	seconds: Run duaration for *.shutdown_secs module parameter.
13*50527f7cSPaul E. McKenney#	bootargs: New kernel boot parameters.  Beware of Robert Tables.
1406efa9b4SPaul E. McKenney#
1506efa9b4SPaul E. McKenney# The original qemu-cmd file is provided on standard input.
1606efa9b4SPaul E. McKenney# The transformed qemu-cmd file is on standard output.
1706efa9b4SPaul E. McKenney# The transformation assumes that the qemu command is confined to a
1806efa9b4SPaul E. McKenney# single line.  It also assumes no whitespace in filenames.
1906efa9b4SPaul E. McKenney#
2006efa9b4SPaul E. McKenney# Copyright (C) 2020 Facebook, Inc.
2106efa9b4SPaul E. McKenney#
2206efa9b4SPaul E. McKenney# Authors: Paul E. McKenney <paulmck@kernel.org>
2306efa9b4SPaul E. McKenney
24*50527f7cSPaul E. McKenneyT=`mktemp -d /tmp/kvm-transform.sh.XXXXXXXXXX`
25*50527f7cSPaul E. McKenneytrap 'rm -rf $T' 0 2
26*50527f7cSPaul E. McKenney
2706efa9b4SPaul E. McKenneyimage="$1"
2806efa9b4SPaul E. McKenneyif test -z "$image"
2906efa9b4SPaul E. McKenneythen
3006efa9b4SPaul E. McKenney	echo Need kernel image file.
3106efa9b4SPaul E. McKenney	exit 1
3206efa9b4SPaul E. McKenneyfi
3306efa9b4SPaul E. McKenneyconsolelog="$2"
3406efa9b4SPaul E. McKenneyif test -z "$consolelog"
3506efa9b4SPaul E. McKenneythen
3606efa9b4SPaul E. McKenney	echo "Need console log file name."
3706efa9b4SPaul E. McKenney	exit 1
3806efa9b4SPaul E. McKenneyfi
39018629e9SPaul E. McKenneyjitter_dir="$3"
40018629e9SPaul E. McKenneyif test -z "$jitter_dir" || ! test -d "$jitter_dir"
41018629e9SPaul E. McKenneythen
42018629e9SPaul E. McKenney	echo "Need valid jitter directory: '$jitter_dir'"
43018629e9SPaul E. McKenney	exit 1
44018629e9SPaul E. McKenneyfi
45018629e9SPaul E. McKenneyseconds="$4"
4600505165SPaul E. McKenneyif test -n "$seconds" && echo $seconds | grep -q '[^0-9]'
4700505165SPaul E. McKenneythen
4800505165SPaul E. McKenney	echo "Invalid duration, should be numeric in seconds: '$seconds'"
4900505165SPaul E. McKenney	exit 1
5000505165SPaul E. McKenneyfi
51*50527f7cSPaul E. McKenneybootargs="$5"
5206efa9b4SPaul E. McKenney
53*50527f7cSPaul E. McKenney# Build awk program.
54*50527f7cSPaul E. McKenneyecho "BEGIN {" > $T/bootarg.awk
55*50527f7cSPaul E. McKenneyecho $bootargs | tr -s ' ' '\012' |
56*50527f7cSPaul E. McKenney	awk -v dq='"' '/./ { print "\tbootarg[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
57*50527f7cSPaul E. McKenneyecho $bootargs | tr -s ' ' '\012' | sed -e 's/=.*$//' |
58*50527f7cSPaul E. McKenney	awk -v dq='"' '/./ { print "\tbootpar[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
59*50527f7cSPaul E. McKenneycat >> $T/bootarg.awk << '___EOF___'
60*50527f7cSPaul E. McKenney}
61*50527f7cSPaul E. McKenney
62a1ab2e89SPaul E. McKenney/^# seconds=/ {
63a1ab2e89SPaul E. McKenney	if (seconds == "")
64a1ab2e89SPaul E. McKenney		print $0;
65a1ab2e89SPaul E. McKenney	else
66a1ab2e89SPaul E. McKenney		print "# seconds=" seconds;
67a1ab2e89SPaul E. McKenney	next;
68a1ab2e89SPaul E. McKenney}
69a1ab2e89SPaul E. McKenney
70018629e9SPaul E. McKenney/^# TORTURE_JITTER_START=/ {
71018629e9SPaul E. McKenney	print "# TORTURE_JITTER_START=\". jitterstart.sh " $4 " " jitter_dir " " $6 " " $7;
72018629e9SPaul E. McKenney	next;
73018629e9SPaul E. McKenney}
74018629e9SPaul E. McKenney
75018629e9SPaul E. McKenney/^# TORTURE_JITTER_STOP=/ {
76018629e9SPaul E. McKenney	print "# TORTURE_JITTER_STOP=\". jitterstop.sh " " " jitter_dir " " $5;
77018629e9SPaul E. McKenney	next;
78018629e9SPaul E. McKenney}
79018629e9SPaul E. McKenney
8000505165SPaul E. McKenney/^#/ {
8100505165SPaul E. McKenney	print $0;
8200505165SPaul E. McKenney	next;
8300505165SPaul E. McKenney}
8400505165SPaul E. McKenney
8506efa9b4SPaul E. McKenney{
8606efa9b4SPaul E. McKenney	line = "";
8706efa9b4SPaul E. McKenney	for (i = 1; i <= NF; i++) {
88*50527f7cSPaul E. McKenney		if (line == "") {
8900505165SPaul E. McKenney			line = $i;
9000505165SPaul E. McKenney		} else {
9100505165SPaul E. McKenney			line = line " " $i;
9200505165SPaul E. McKenney		}
9306efa9b4SPaul E. McKenney		if ($i == "-serial") {
9406efa9b4SPaul E. McKenney			i++;
9506efa9b4SPaul E. McKenney			line = line " file:" consolelog;
9600505165SPaul E. McKenney		} else if ($i == "-kernel") {
9706efa9b4SPaul E. McKenney			i++;
9806efa9b4SPaul E. McKenney			line = line " " image;
99*50527f7cSPaul E. McKenney		} else if ($i == "-append") {
100*50527f7cSPaul E. McKenney			for (i++; i <= NF; i++) {
101*50527f7cSPaul E. McKenney				arg = $i;
102*50527f7cSPaul E. McKenney				lq = "";
103*50527f7cSPaul E. McKenney				rq = "";
104*50527f7cSPaul E. McKenney				if ("" seconds != "" && $i ~ /\.shutdown_secs=[0-9]*$/)
105*50527f7cSPaul E. McKenney					sub(/[0-9]*$/, seconds, arg);
106*50527f7cSPaul E. McKenney				if (arg ~ /^"/) {
107*50527f7cSPaul E. McKenney					lq = substr(arg, 1, 1);
108*50527f7cSPaul E. McKenney					arg  = substr(arg, 2);
109*50527f7cSPaul E. McKenney				}
110*50527f7cSPaul E. McKenney				if (arg ~ /"$/) {
111*50527f7cSPaul E. McKenney					rq = substr(arg, length($i), 1);
112*50527f7cSPaul E. McKenney					arg = substr(arg, 1, length($i) - 1);
113*50527f7cSPaul E. McKenney				}
114*50527f7cSPaul E. McKenney				par = arg;
115*50527f7cSPaul E. McKenney				gsub(/=.*$/, "", par);
116*50527f7cSPaul E. McKenney				j = 1;
117*50527f7cSPaul E. McKenney				while (bootpar[j] != "") {
118*50527f7cSPaul E. McKenney					if (bootpar[j] == par) {
119*50527f7cSPaul E. McKenney						arg = "";
120*50527f7cSPaul E. McKenney						break;
121*50527f7cSPaul E. McKenney					}
122*50527f7cSPaul E. McKenney					j++;
123*50527f7cSPaul E. McKenney				}
124*50527f7cSPaul E. McKenney				if (line == "")
125*50527f7cSPaul E. McKenney					line = lq arg;
126*50527f7cSPaul E. McKenney				else
127*50527f7cSPaul E. McKenney					line = line " " lq arg;
128*50527f7cSPaul E. McKenney			}
129*50527f7cSPaul E. McKenney			for (j in bootarg)
130*50527f7cSPaul E. McKenney				line = line " " bootarg[j];
131*50527f7cSPaul E. McKenney			line = line rq;
13206efa9b4SPaul E. McKenney		}
13306efa9b4SPaul E. McKenney	}
13406efa9b4SPaul E. McKenney	print line;
135*50527f7cSPaul E. McKenney}
136*50527f7cSPaul E. McKenney___EOF___
137*50527f7cSPaul E. McKenney
138*50527f7cSPaul E. McKenneyawk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
139*50527f7cSPaul E. McKenney    -v seconds="$seconds" -f $T/bootarg.awk
140