File Index
Files and directories
Sign in
FILE

kvm-transform.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/rcutorture/bin/kvm-transform.sh BASH
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0+
  3#
  4# Transform a qemu-cmd file to allow reuse.
  5#
  6# Usage: kvm-transform.sh bzImage console.log jitter_dir seconds [ bootargs ] < qemu-cmd-in > qemu-cmd-out
  7#
  8#	bzImage: Kernel and initrd from the same prior kvm.sh run.
  9#	console.log: File into which to place console output.
 10#	jitter_dir: Jitter directory for TORTURE_JITTER_START and
 11#		TORTURE_JITTER_STOP environment variables.
 12#	seconds: Run duaration for *.shutdown_secs module parameter.
 13#	bootargs: New kernel boot parameters.  Beware of Robert Tables.
 14#
 15# The original qemu-cmd file is provided on standard input.
 16# The transformed qemu-cmd file is on standard output.
 17# The transformation assumes that the qemu command is confined to a
 18# single line.  It also assumes no whitespace in filenames.
 19#
 20# Copyright (C) 2020 Facebook, Inc.
 21#
 22# Authors: Paul E. McKenney <paulmck@kernel.org>
 23
 24T=`mktemp -d /tmp/kvm-transform.sh.XXXXXXXXXX`
 25trap 'rm -rf $T' 0 2
 26
 27image="$1"
 28if test -z "$image"
 29then
 30	echo Need kernel image file.
 31	exit 1
 32fi
 33consolelog="$2"
 34if test -z "$consolelog"
 35then
 36	echo "Need console log file name."
 37	exit 1
 38fi
 39jitter_dir="$3"
 40if test -z "$jitter_dir" || ! test -d "$jitter_dir"
 41then
 42	echo "Need valid jitter directory: '$jitter_dir'"
 43	exit 1
 44fi
 45seconds="$4"
 46if test -n "$seconds" && echo $seconds | grep -q '[^0-9]'
 47then
 48	echo "Invalid duration, should be numeric in seconds: '$seconds'"
 49	exit 1
 50fi
 51bootargs="$5"
 52
 53# Build awk program.
 54echo "BEGIN {" > $T/bootarg.awk
 55echo $bootargs | tr -s ' ' '\012' |
 56	awk -v dq='"' '/./ { print "\tbootarg[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
 57echo $bootargs | tr -s ' ' '\012' | sed -e 's/=.*$//' |
 58	awk -v dq='"' '/./ { print "\tbootpar[" NR "] = " dq $1 dq ";" }' >> $T/bootarg.awk
 59cat >> $T/bootarg.awk << '___EOF___'
 60}
 61
 62/^# seconds=/ {
 63	if (seconds == "")
 64		print $0;
 65	else
 66		print "# seconds=" seconds;
 67	next;
 68}
 69
 70/^# TORTURE_JITTER_START=/ {
 71	print "# TORTURE_JITTER_START=\". jitterstart.sh " $4 " " jitter_dir " " $6 " " $7;
 72	next;
 73}
 74
 75/^# TORTURE_JITTER_STOP=/ {
 76	print "# TORTURE_JITTER_STOP=\". jitterstop.sh " " " jitter_dir " " $5;
 77	next;
 78}
 79
 80/^#/ {
 81	print $0;
 82	next;
 83}
 84
 85{
 86	line = "";
 87	for (i = 1; i <= NF; i++) {
 88		if (line == "") {
 89			line = $i;
 90		} else {
 91			line = line " " $i;
 92		}
 93		if ($i == "-serial") {
 94			i++;
 95			line = line " file:" consolelog;
 96		} else if ($i == "-kernel") {
 97			i++;
 98			line = line " " image;
 99		} else if ($i == "-append") {
100			for (i++; i <= NF; i++) {
101				arg = $i;
102				lq = "";
103				rq = "";
104				if ("" seconds != "" && $i ~ /\.shutdown_secs=[0-9]*$/)
105					sub(/[0-9]*$/, seconds, arg);
106				if (arg ~ /^"/) {
107					lq = substr(arg, 1, 1);
108					arg  = substr(arg, 2);
109				}
110				if (arg ~ /"$/) {
111					rq = substr(arg, length($i), 1);
112					arg = substr(arg, 1, length($i) - 1);
113				}
114				par = arg;
115				gsub(/=.*$/, "", par);
116				j = 1;
117				while (bootpar[j] != "") {
118					if (bootpar[j] == par) {
119						arg = "";
120						break;
121					}
122					j++;
123				}
124				if (line == "")
125					line = lq arg;
126				else
127					line = line " " lq arg;
128			}
129			for (j in bootarg)
130				line = line " " bootarg[j];
131			line = line rq;
132		}
133	}
134	print line;
135}
136___EOF___
137
138awk -v image="$image" -v consolelog="$consolelog" -v jitter_dir="$jitter_dir" \
139    -v seconds="$seconds" -f $T/bootarg.awk
~/ Read-only file preview.