From ef4b915ad982877fbc2e41f9fdb4a4bb57c853d2 Mon Sep 17 00:00:00 2001 From: Robert Millan Date: Sun, 8 Nov 2009 20:56:32 +0000 Subject: [PATCH] Implement grub-mkrescue for coreboot (needs external grub-mkisofs) --- ChangeLog.branch | 5 + conf/i386-coreboot.rmk | 3 + util/i386/coreboot/grub-mkrescue.in | 144 ++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 ChangeLog.branch create mode 100644 util/i386/coreboot/grub-mkrescue.in diff --git a/ChangeLog.branch b/ChangeLog.branch new file mode 100644 index 000000000..4794498ff --- /dev/null +++ b/ChangeLog.branch @@ -0,0 +1,5 @@ +2009-11-08 Robert Millan + + * util/i386/coreboot/grub-mkrescue.in: New file. + * conf/i386-coreboot.rmk (bin_SCRIPTS, grub_mkrescue_SOURCES): New + variables. diff --git a/conf/i386-coreboot.rmk b/conf/i386-coreboot.rmk index 09ec7787c..5645395b8 100644 --- a/conf/i386-coreboot.rmk +++ b/conf/i386-coreboot.rmk @@ -152,6 +152,9 @@ grub_emu_LDFLAGS = $(LIBCURSES) sbin_SCRIPTS += grub-install grub_install_SOURCES = util/i386/pc/grub-install.in +bin_SCRIPTS += grub-mkrescue +grub_mkrescue_SOURCES = util/i386/coreboot/grub-mkrescue.in + # Modules. pkglib_MODULES = linux.mod multiboot.mod \ aout.mod play.mod serial.mod ata.mod \ diff --git a/util/i386/coreboot/grub-mkrescue.in b/util/i386/coreboot/grub-mkrescue.in new file mode 100644 index 000000000..fbfc13841 --- /dev/null +++ b/util/i386/coreboot/grub-mkrescue.in @@ -0,0 +1,144 @@ +#! /bin/sh -e + +# Make GRUB rescue image +# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 Free Software Foundation, Inc. +# +# 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 . + +# Initialize some variables. +transform="@program_transform_name@" + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +libdir=@libdir@ +PACKAGE_NAME=@PACKAGE_NAME@ +PACKAGE_TARNAME=@PACKAGE_TARNAME@ +PACKAGE_VERSION=@PACKAGE_VERSION@ +target_cpu=@target_cpu@ +platform=@platform@ +pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}` + +grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}` + +# Usage: usage +# Print the usage. +usage () { + cat <. +EOF +} + +input_dir=${pkglibdir} + +# Check the arguments. +for option in "$@"; do + case "$option" in + -h | --help) + usage + exit 0 ;; + -v | --version) + echo "grub-mkrescue (GNU GRUB ${PACKAGE_VERSION})" + exit 0 ;; + --modules=*) + modules=`echo "$option" | sed 's/--modules=//'` ;; + --overlay=*) + overlay=${overlay}${overlay:+ }`echo "$option" | sed 's/--overlay=//'` ;; + --pkglibdir=*) + input_dir=`echo "$option" | sed 's/--pkglibdir=//'` ;; + --grub-mkimage=*) + grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;; + -*) + echo "Unrecognized option \`$option'" 1>&2 + usage + exit 1 + ;; + *) + if test "x$output_image" != x; then + echo "Unrecognized option \`$option'" 1>&2 + usage + exit 1 + fi + output_image="${option}" ;; + esac +done + +if test "x$output_image" = x; then + usage + exit 1 +fi + +memdisk_dir=`mktemp -d` +iso9660_dir=`mktemp -d` +mkdir -p ${memdisk_dir}/boot/grub ${iso9660_dir}/boot/grub + +for file in ${input_dir}/*.mod ${input_dir}/efiemu??.o \ + ${input_dir}/command.lst ${input_dir}/moddep.lst ${input_dir}/fs.lst \ + ${input_dir}/handler.lst ${input_dir}/parttool.lst; do + if test -f "$file"; then + cp -f "$file" ${iso9660_dir}/boot/grub/ + fi +done + +# obtain date-based UUID +iso_uuid=$(date +%Y-%m-%d-%H-%M-%S-00) + +# first-stage grub.cfg +cat << EOF >> ${memdisk_dir}/boot/grub/grub.cfg +search --fs-uuid --set ${iso_uuid} +set prefix=(\${root})/boot/grub +source /boot/grub/grub.cfg +EOF + +# build memdisk +memdisk_img=`mktemp` +tar -C ${memdisk_dir} -cf ${memdisk_img} boot +rm -rf ${memdisk_dir} + +# build core.img +mkdir -p ${iso9660_dir}/boot/grub +${grub_mkimage} -d ${input_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \ + at_keyboard memdisk tar ata search iso9660 configfile sh +rm -f ${memdisk_img} + +for d in ${overlay}; do + echo "Overlaying $d" + cp -dpR "${d}"/* "${iso9660_dir}"/ +done + +# second-stage grub.cfg +modules="`cat ${input_dir}/partmap.lst` ${modules}" +for i in ${modules} ; do + echo "insmod $i" +done > ${iso9660_dir}/boot/grub/grub.cfg + +# build iso image +grub-mkisofs \ + --modification-date=$(echo ${iso_uuid} | sed -e s/-//g) \ + -o ${output_image} -r -J ${iso9660_dir} + +exit 0