]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
coreboot and qemu rescue disks and bootchecks
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 1 May 2010 14:33:22 +0000 (16:33 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Sat, 1 May 2010 14:33:22 +0000 (16:33 +0200)
conf/i386-coreboot.rmk
conf/i386-qemu.rmk
tests/util/grub-shell.in
util/grub-mkrescue.in

index ce54b80b1affd6232e1772e27da12ab6a3460864..805cc40b1aa068cb9c66b57a3ff6dc4844e3cb06 100644 (file)
@@ -71,5 +71,8 @@ datetime_mod_SOURCES = lib/cmos_datetime.c
 datetime_mod_CFLAGS = $(COMMON_CFLAGS)
 datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+BOOTTARGET=coreboot
+QEMU32=qemu-system-i386
+
 include $(srcdir)/conf/i386.mk
 include $(srcdir)/conf/common.mk
index 6d387a6f69c106d732751ede8a11b26a8e7a78c2..416fbc0f3ca06b3d2e023a02ccc51cf995916fd4 100644 (file)
@@ -61,5 +61,8 @@ datetime_mod_SOURCES = lib/cmos_datetime.c
 datetime_mod_CFLAGS = $(COMMON_CFLAGS)
 datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
 
+BOOTTARGET=qemu
+QEMU32=qemu-system-i386
+
 include $(srcdir)/conf/i386.mk
 include $(srcdir)/conf/common.mk
index d8ea588a78dec27dd428fea30be2cb805fb0ee13..86b46cf772950c89aaf60b66daa7eb36bcba0eb4 100644 (file)
@@ -83,6 +83,8 @@ for option in "$@"; do
        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
@@ -119,6 +121,8 @@ terminal_input serial
 terminal_output serial
 EOF
 
+rom_directory=`mktemp -d`
+
 for mod in ${modules}
 do
     echo "insmod ${mod}" >> ${cfgfile}
@@ -131,25 +135,43 @@ EOF
 
 isofile=`mktemp`
 grub-mkrescue --output=${isofile} --override-directory=${builddir} \
+    --rom-directory="${rom_directory}" \
     /boot/grub/grub.cfg=${cfgfile} /boot/grub/testcase.cfg=${source} \
     ${files} >/dev/null 2>&1
 if [ x$boot = xhd ]; then
     device=hda
-    bootdev=c
+    bootdev="-boot c"
 fi
 if [ x$boot = xcd ]; then
     device=cdrom
-    bootdev=d
+    bootdev="-boot d"
 fi
 if [ x$boot = xfd ]; then
     device=fda
-    bootdev=a
+    bootdev="-boot a"
+fi
+
+if [ x$boot = xqemu ]; then
+    bootdev="-bios ${rom_directory}/qemu.img"
+    device=cdrom
 fi
 
-${qemu} ${qemuopts} -nographic -serial file:/dev/stdout -monitor file:/dev/null -${device} ${isofile} -boot ${bootdev} | tr -d "\r"
-rm -f ${isofile}
+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
+
+${qemu} ${qemuopts} -nographic -serial file:/dev/stdout -monitor file:/dev/null -${device} ${isofile} ${bootdev} | tr -d "\r"
+rm -f "${isofile}" "${imgfile}"
+rm -rf "${rom_directory}"
+if [ x$boot = xcoreboot ]; then
+    rm -f "${imgfile}"
+fi
 
-rm -f ${tmpfile} ${cfgfile}
+rm -f "${tmpfile}" "${cfgfile}"
 exit 0
 
 
index 365c48f291f75c6a6967dafac0bd4a8cb4f5857d..56b27a6e9df4313548965c16da504d1526fd1381 100644 (file)
@@ -30,10 +30,13 @@ target_cpu=@target_cpu@
 native_platform=@platform@
 pkglib_DATA="@pkglib_DATA@"
 
-multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-multiboot
-pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/${target_cpu}-pc
+multiboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-multiboot
+coreboot_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-coreboot
+qemu_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-qemu
+pc_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-pc
 efi32_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/i386-efi
 efi64_dir=${libdir}/$(echo ${PACKAGE_TARNAME} | sed ${transform})/x86_64-efi
+rom_directory=
 
 # Usage: usage
 # Print the usage.
@@ -46,6 +49,7 @@ Make GRUB rescue image.
   -v, --version           print the version information and exit
   --modules=MODULES       pre-load specified modules MODULES
   --output=FILE           save output in FILE [required]
+  --rom-directory=DIR     save rom images in DIR [optional]
 
 $0 generates a bootable rescue image with specified source files or directories.
 
@@ -66,6 +70,8 @@ for option in "$@"; do
        modules=`echo "$option" | sed 's/--modules=//'` ;;
     --output=*)
        output_image=`echo "$option" | sed 's/--output=//'` ;;
+    --rom-directory=*)
+       rom_directory=`echo "$option" | sed 's/--rom-directory=//'` ;;
     # Intentionally undocumented
     --override-directory=*)
        override_dir=`echo "${option}/" | sed 's/--override-directory=//'`
@@ -103,15 +109,15 @@ process_input_dir ()
 {
     input_dir="$1"
     platform="$2"
-    mkdir -p ${iso9660_dir}/boot/grub/${target_cpu}-${platform}
+    mkdir -p ${iso9660_dir}/boot/grub/${platform}
     for file in ${input_dir}/*.mod; do
         if test -f "$file"; then
-            cp -f "$file" ${iso9660_dir}/boot/grub/${target_cpu}-${platform}/
+            cp -f "$file" ${iso9660_dir}/boot/grub/${platform}/
         fi
     done
     for file in ${pkglib_DATA}; do
        if test -f "${input_dir}/${file}"; then
-            cp -f "${input_dir}/${file}" ${iso9660_dir}/boot/grub/${target_cpu}-${platform}/
+            cp -f "${input_dir}/${file}" ${iso9660_dir}/boot/grub/${platform}/
        fi
     done
 
@@ -123,27 +129,70 @@ process_input_dir ()
     done
 }
 
+make_image ()
+{
+    source_directory="$1"
+    platform=$2
+    if ! test -e "${source_directory}"; then
+       return;
+    fi
+
+    echo "Enabling $2 support ..."
+
+    memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
+    memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
+    mkdir -p ${memdisk_dir}/boot/grub
+
+    modules="$(cat ${source_directory}/partmap.lst) ${modules}"
+    cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
+search --fs-uuid --set ${iso_uuid}
+set prefix=(\${root})/boot/grub/${platform}
+source \$prefix/grub.cfg
+EOF
+    (for i in ${modules} ; do
+        echo "insmod $i"
+    done ; \
+    echo "source /boot/grub/grub.cfg") \
+    > ${iso9660_dir}/boot/grub/${platform}/grub.cfg
+
+    tar -C ${memdisk_dir} -cf ${memdisk_img} boot
+    rm -rf ${memdisk_dir}
+    grub-mkimage -O ${platform} -d "${source_directory}" -m "${memdisk_img}" -o "$3" --prefix='(memdisk)/boot/grub' \
+        search iso9660 configfile sh memdisk tar $4
+    rm -rf ${memdisk_img}
+}
+
 if [ "${override_dir}" = "" ] ; then
     if test -e "${multiboot_dir}" ; then
-        process_input_dir ${multiboot_dir} multiboot
+        process_input_dir ${multiboot_dir} i386-multiboot
+    fi
+    if test -e "${coreboot_dir}" ; then
+        process_input_dir ${coreboot_dir} i386-coreboot
+    fi
+    if test -e "${qemu_dir}" ; then
+        process_input_dir ${qemu_dir} i386-qemu
     fi
     if test -e "${pc_dir}" ; then
-        process_input_dir ${pc_dir} pc
+        process_input_dir ${pc_dir} i386-pc
     fi
     if test -e "${efi32_dir}" ; then
-        process_input_dir ${efi32_dir} efi32
+        process_input_dir ${efi32_dir} i386-efi
     fi
     if test -e "${efi64_dir}" ; then
-        process_input_dir ${efi64_dir} efi64
+        process_input_dir ${efi64_dir} x86_64-efi
     fi
 else
-    process_input_dir ${override_dir} ${native_platform}
+    process_input_dir ${override_dir} ${target_cpu}-${native_platform}
     multiboot_dir=
     pc_dir=
     efi32_dir=
     efi64_dir=
-    case "${native_platform}" in
+    coreboot_dir=
+    qemu_dir=
+    case "${target_cpu}-${native_platform}" in
         i386-multiboot) multiboot_dir=${override_dir} ;;
+        i386-coreboot) coreboot_dir=${override_dir} ;;
+        i386-qemu) qemu_dir=${override_dir} ;;
         i386-pc) pc_dir=${override_dir} ;;
        i386-efi) efi32_dir=${override_dir} ;;
        x86_64-efi) efi64_dir=${override_dir} ;;
@@ -154,33 +203,6 @@ fi
 iso_uuid=$(date -u +%Y-%m-%d-%H-%M-%S-00)
 grub_mkisofs_arguments="${grub_mkisofs_arguments} --modification-date=$(echo ${iso_uuid} | sed -e s/-//g)"
 
-# build multiboot core.img
-if test -e "${multiboot_dir}" ; then
-    echo "Enabling multiboot support ..."
-    memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
-    memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
-    mkdir -p ${memdisk_dir}/boot/grub
-
-    modules="$(cat ${multiboot_dir}/partmap.lst) ${modules}"
-    cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
-search --fs-uuid --set ${iso_uuid}
-set prefix=(\${root})/boot/grub/${target_cpu}-multiboot
-source \$prefix/grub.cfg
-EOF
-    (for i in ${modules} ; do
-        echo "insmod $i"
-    done ; \
-    echo "source /boot/grub/grub.cfg") \
-    > ${iso9660_dir}/boot/grub/i386-multiboot/grub.cfg
-
-    tar -C ${memdisk_dir} -cf ${memdisk_img} boot
-    rm -rf ${memdisk_dir}
-    grub-mkimage -O i386-multiboot -d ${multiboot_dir}/ -m ${memdisk_img} -o ${iso9660_dir}/boot/multiboot.img \
-        memdisk tar search iso9660 configfile sh \
-        ata at_keyboard
-    rm -f ${memdisk_img}
-fi
-
 # build BIOS core.img
 if test -e "${pc_dir}" ; then
     echo "Enabling BIOS support ..."
@@ -205,47 +227,32 @@ if test -e "${pc_dir}" ; then
                --embedded-boot ${embed_img}"
 fi
 
+# build multiboot core.img
+make_image "${multiboot_dir}" i386-multiboot "${iso9660_dir}/boot/multiboot.img" "ata at_keyboard"
+
 if test -e "${efi64_dir}" || test -e "${efi32_dir}"; then
     efi_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
     mkdir -p "${efi_dir}/efi/boot"
-else
-    efi_dir=
-fi
 
-# build bootx64.efi
-if test -e "${efi64_dir}" ; then
-    echo "Enabling EFI64 support ..."
-    memdisk_img=`mktemp "$MKTEMP_TEMPLATE"`
-    memdisk_dir=`mktemp -d "$MKTEMP_TEMPLATE"`
-    mkdir -p ${memdisk_dir}/boot/grub
+    # build bootx64.efi
+    make_image "${efi64_dir}" x86_64-efi "${efi_dir}"/efi/boot/bootx64.efi ""
+    # build bootia32.efi
+    make_image "${efi32_dir}" i386-efi "${efi_dir}"/efi/boot/bootia32.efi ""
 
-    cat << EOF > ${memdisk_dir}/boot/grub/grub.cfg
-search --fs-uuid --set ${iso_uuid}
-set prefix=(\${root})/boot/grub/${target_cpu}-efi
-source \$prefix/grub.cfg
-EOF
-
-    tar -C ${memdisk_dir} -cf ${memdisk_img} boot
-    rm -rf ${memdisk_dir}
-
-    grub-mkimage -O x86_64-efi -d "${efi64_dir}" -m "${memdisk_img}" -o "${efi_dir}"/efi/boot/bootx64.efi --prefix='(memdisk)/boot/grub' \
-        search iso9660 configfile sh memdisk tar
-    rm -f ${memdisk_img}
-
-    modules="$(cat "${efi64_dir}"/partmap.lst) ${modules}"
-    (for i in ${modules} ; do
-        echo "insmod $i"
-    done ; \
-    echo "source /boot/grub/grub.cfg") \
-    > "${iso9660_dir}"/boot/grub/x86_64-efi/grub.cfg
-fi
-
-if test x"${efi_dir}" != x; then
     mformat -C -f 2880 -L 16 -i "${iso9660_dir}"/efi.img ::
     mcopy -s -i "${iso9660_dir}"/efi.img ${efi_dir}/efi ::/
     grub_mkisofs_arguments="${grub_mkisofs_arguments} --efi-boot efi.img"
 fi
 
+make_image "${qemu_dir}" i386-qemu "${iso9660_dir}/boot/qemu.img" "ata at_keyboard"
+if [ -e "${iso9660_dir}/boot/qemu.img" ] && [ -d "${rom_directory}" ]; then
+    cp "${iso9660_dir}/boot/qemu.img" "${rom_directory}/qemu.img"
+fi
+make_image "${coreboot_dir}" i386-coreboot "${iso9660_dir}/boot/coreboot.elf" "ata at_keyboard"
+if [ -e "${iso9660_dir}/boot/coreboot.elf" ] && [ -d "${rom_directory}" ]; then
+    cp "${iso9660_dir}/boot/coreboot.elf" "${rom_directory}/coreboot.elf"
+fi
+
 # build iso image
 xorriso -pathspecs on -as mkisofs ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} ${source}
 rm -rf ${iso9660_dir}