grub/tests/util/grub-shell.in

178 lines
4.4 KiB
Text
Raw Normal View History

#! /bin/sh -e
2010-01-08 09:49:10 +00:00
# Run GRUB script in a Qemu instance
2010-01-22 13:37:27 +00:00
# Copyright (C) 2009,2010 Free Software Foundation, Inc.
2010-01-08 09:49:10 +00:00
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB. If not, see <http://www.gnu.org/licenses/>.
# Initialize some variables.
transform="@program_transform_name@"
prefix=@prefix@
exec_prefix=@exec_prefix@
bindir=@bindir@
libdir=@libdir@
builddir=@builddir@
PACKAGE_NAME=@PACKAGE_NAME@
PACKAGE_TARNAME=@PACKAGE_TARNAME@
PACKAGE_VERSION=@PACKAGE_VERSION@
target_cpu=@target_cpu@
# Force build directory components
PATH=${builddir}:$PATH
export PATH
# Usage: usage
# Print the usage.
usage () {
cat <<EOF
Usage: $0 [OPTION] [SOURCE]
Run GRUB script in a Qemu instance.
-h, --help print this message and exit
-v, --version print the version information and exit
--boot=[fd|hd|cd] boot method for Qemu instance
2010-01-08 09:49:10 +00:00
--modules=MODULES pre-load specified modules MODULES
2010-01-17 22:36:45 +00:00
--qemu=FILE Name of qemu binary
2010-01-08 09:49:10 +00:00
--qemu-opts=OPTIONS extra options to pass to Qemu instance
2010-01-17 22:36:45 +00:00
--files=FILES add files to the image
2010-01-08 09:49:10 +00:00
$0 runs input GRUB script or SOURCE file in a Qemu instance and prints
its output.
Report bugs to <bug-grub@gnu.org>.
EOF
}
2010-04-27 08:37:27 +00:00
boot=hd
2010-01-17 22:36:45 +00:00
qemu=qemu-system-i386
2010-01-08 09:49:10 +00:00
# Check the arguments.
for option in "$@"; do
case "$option" in
-h | --help)
usage
exit 0 ;;
-v | --version)
echo "$0 (GNU GRUB ${PACKAGE_VERSION})"
exit 0 ;;
--modules=*)
ms=`echo "$option" | sed -e 's/--modules=//' -e 's/,/ /g'`
modules="$modules $ms" ;;
2010-01-17 22:36:45 +00:00
--files=*)
fls=`echo "$option" | sed -e 's/--files=//' -e 's/,/ /g'`
files="$files $fls" ;;
--qemu=*)
qemu=`echo "$option" | sed -e 's/--qemu=//' -e 's/,/ /g'`;;
2010-01-08 09:49:10 +00:00
--qemu-opts=*)
qs=`echo "$option" | sed -e 's/--qemu-opts=//'`
qemuopts="$qemuopts $qs" ;;
--boot=*)
dev=`echo "$option" | sed -e 's/--boot=//'`
2010-04-27 08:37:27 +00:00
if [ "$dev" = "fd" ] ; then boot=fd;
elif [ "$dev" = "hd" ] ; then boot=hd;
elif [ "$dev" = "cd" ] ; then boot=cd;
elif [ "$dev" = "qemu" ] ; then boot=qemu;
elif [ "$dev" = "coreboot" ] ; then boot=coreboot;
else
echo "Unrecognized boot method \`$dev'" 1>&2
usage
exit 1
fi ;;
2010-01-08 09:49:10 +00:00
-*)
echo "Unrecognized option \`$option'" 1>&2
usage
exit 1 ;;
2010-01-08 09:49:10 +00:00
*)
if [ "x${source}" != x ] ; then
echo "too many parameters at the end" 1>&2
usage
exit 1
fi
source="${option}" ;;
esac
done
if [ "x${source}" = x ] ; then
tmpfile=`mktemp`
while read REPLY; do
2010-07-22 21:27:02 +00:00
echo "$REPLY" >> ${tmpfile}
done
source=${tmpfile}
fi
2010-01-08 09:49:10 +00:00
cfgfile=`mktemp`
cat <<EOF >${cfgfile}
grubshell=yes
insmod serial
serial
terminal_input serial
terminal_output serial
EOF
rom_directory=`mktemp -d`
2010-01-08 09:49:10 +00:00
for mod in ${modules}
do
echo "insmod ${mod}" >> ${cfgfile}
2010-01-08 09:49:10 +00:00
done
cat <<EOF >>${cfgfile}
source /boot/grub/testcase.cfg
halt
EOF
isofile=`mktemp`
sh @builddir@/grub-mkrescue --grub-mkimage=${builddir}/grub-mkimage --output=${isofile} --override-directory=${builddir}/grub-core \
--rom-directory="${rom_directory}" \
2010-04-27 08:37:27 +00:00
/boot/grub/grub.cfg=${cfgfile} /boot/grub/testcase.cfg=${source} \
${files} >/dev/null 2>&1
if [ x$boot = xhd ]; then
device=hda
bootdev="-boot c"
2010-01-17 22:36:45 +00:00
fi
2010-04-27 08:37:27 +00:00
if [ x$boot = xcd ]; then
device=cdrom
bootdev="-boot d"
2010-04-27 08:37:27 +00:00
fi
if [ x$boot = xfd ]; then
device=fda
bootdev="-boot a"
fi
if [ x$boot = xqemu ]; then
bootdev="-bios ${rom_directory}/qemu.img"
device=cdrom
2010-04-27 08:37:27 +00:00
fi
if [ x$boot = xcoreboot ]; then
imgfile=`mktemp`
cp "${GRUB_COREBOOT_ROM}" "${imgfile}"
"${GRUB_CBFSTOOL}" "${imgfile}" add-payload "${rom_directory}/coreboot.elf" fallback/payload
bootdev="-bios ${imgfile}"
device=cdrom
fi
2010-01-08 09:49:10 +00:00
2010-08-25 14:59:11 +00:00
${qemu} ${qemuopts} -nographic -serial file:/dev/stdout -monitor file:/dev/null -${device} ${isofile} ${bootdev} | cat | tr -d "\r"
rm -f "${isofile}" "${imgfile}"
rm -rf "${rom_directory}"
if [ x$boot = xcoreboot ]; then
rm -f "${imgfile}"
fi
2010-01-08 09:49:10 +00:00
rm -f "${tmpfile}" "${cfgfile}"
2010-01-08 09:49:10 +00:00
exit 0