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