* [PATCH] grub-install on coreboot
@ 2008-11-22 15:53 Robert Millan
2008-11-28 20:06 ` Robert Millan
0 siblings, 1 reply; 2+ messages in thread
From: Robert Millan @ 2008-11-22 15:53 UTC (permalink / raw)
To: grub-devel
[-- Attachment #1: Type: text/plain, Size: 754 bytes --]
Hi,
This patch implements grub-install on coreboot. Since there's no pre-defined
boot protocol on this platform, we simply generate a usable Multiboot image
and dump it to /boot. User can afterwards load it to flash to make the board
boot using this disk, or load it from elsewhere (even from a BIOS rescue disk).
I hope it's not too intrusive to reuse i386-pc's grub-install; I think it's
much better than duplicating the whole script.
Note: indentation changes intentionally ommitted to improve readability.
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
[-- Attachment #2: grub-install.diff --]
[-- Type: text/x-diff, Size: 4639 bytes --]
2008-11-22 Robert Millan <rmh@aybabtu.com>
* conf/i386-coreboot.rmk (sbin_SCRIPTS): Add `grub-install'.
(grub_install_SOURCES): New variable.
* util/i386/pc/grub-install.in: Add a few condition checks to make it
usable on coreboot.
Index: conf/i386-coreboot.rmk
===================================================================
--- conf/i386-coreboot.rmk (revision 1926)
+++ conf/i386-coreboot.rmk (working copy)
@@ -90,6 +90,9 @@ grub_emu_SOURCES = commands/boot.c comma
grub_emu_LDFLAGS = $(LIBCURSES)
+sbin_SCRIPTS += grub-install
+grub_install_SOURCES = util/i386/pc/grub-install.in
+
# Modules.
pkglib_MODULES = _linux.mod linux.mod normal.mod \
_multiboot.mod multiboot.mod aout.mod \
Index: util/i386/pc/grub-install.in
===================================================================
--- util/i386/pc/grub-install.in (revision 1926)
+++ util/i386/pc/grub-install.in (working copy)
@@ -32,7 +32,11 @@ platform=@platform@
pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}`
grub_setup=${sbindir}/`echo grub-setup | sed ${transform}`
+if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
+else
+grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}`
+fi
grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
rootdir=
@@ -152,6 +156,7 @@ device_map=${grubdir}/device.map
grub_probe="${grub_probe} --device-map=${device_map}"
+if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
# Check if GRUB is installed.
set $grub_setup dummy
if test -f "$1"; then
@@ -160,6 +165,7 @@ else
echo "$1: Not found." 1>&2
exit 1
fi
+fi
set $grub_mkimage dummy
if test -f "$1"; then
@@ -210,9 +216,14 @@ for file in ${grubdir}/*.mod ${grubdir}/
rm -f $file || exit 1
fi
done
-for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst ${pkglibdir}/*.img; do
+for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst; do
+ cp -f $file ${grubdir} || exit 1
+done
+if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
+for file in ${pkglibdir}/*.img; do
cp -f $file ${grubdir} || exit 1
done
+fi
# Write device to a variable so we don't have to traverse /dev every time.
grub_device=`$grub_probe --target=device ${grubdir}`
@@ -234,7 +245,12 @@ partmap_module=`$grub_probe --target=par
devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}`
# The order in this list is critical. Be careful when modifying it.
-modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module"
+if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
+ modules="$modules biosdisk"
+else
+ modules="$modules ata"
+fi
+modules="$modules $fs_module $partmap_module $devabstraction_module"
prefix_drive=
if [ "x${devabstraction_module}" = "x" ] ; then
@@ -248,7 +264,16 @@ if [ "x${devabstraction_module}" = "x" ]
# Strip partition number
install_drive="`echo ${install_drive} | sed -e s/,[0-9]*//g`"
grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*//g`"
- if [ "x${grub_drive}" != "x${install_drive}" ] ; then
+ if [ "${target_cpu}-${platform}" != "i386-pc" ] ; then
+ # generic method (used on coreboot)
+ uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
+ if [ "x${uuid}" = "x" ] ; then
+ echo "UUID needed on this platform, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
+ exit 1
+ fi
+ prefix_drive="(UUID=${uuid})"
+ modules="$modules fs_uuid"
+ elif [ "x${grub_drive}" != "x${install_drive}" ] ; then
uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
if [ "x${uuid}" = "x" ] ; then
echo "You attempted a cross-disk install, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
@@ -266,12 +291,20 @@ if [ "x${relative_grubdir}" = "x" ] ; th
relative_grubdir=/
fi
+if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
+
$grub_mkimage --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
# Now perform the installation.
$grub_setup ${setup_verbose} --directory=${grubdir} --device-map=${device_map} \
${install_device} || exit 1
+else
+
+$grub_mkimage -d ${pkglibdir} --output=/boot/multiboot.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
+
+fi
+
# Prompt the user to check if the device map is correct.
echo "Installation finished. No error reported."
echo "This is the contents of the device map $device_map."
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] grub-install on coreboot
2008-11-22 15:53 [PATCH] grub-install on coreboot Robert Millan
@ 2008-11-28 20:06 ` Robert Millan
0 siblings, 0 replies; 2+ messages in thread
From: Robert Millan @ 2008-11-28 20:06 UTC (permalink / raw)
To: grub-devel
Committed (after adjusting indentation)
On Sat, Nov 22, 2008 at 04:53:14PM +0100, Robert Millan wrote:
>
> Hi,
>
> This patch implements grub-install on coreboot. Since there's no pre-defined
> boot protocol on this platform, we simply generate a usable Multiboot image
> and dump it to /boot. User can afterwards load it to flash to make the board
> boot using this disk, or load it from elsewhere (even from a BIOS rescue disk).
>
> I hope it's not too intrusive to reuse i386-pc's grub-install; I think it's
> much better than duplicating the whole script.
>
> Note: indentation changes intentionally ommitted to improve readability.
>
> --
> Robert Millan
>
> The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
> how) you may access your data; but nobody's threatening your freedom: we
> still allow you to remove your data and not access it at all."
> 2008-11-22 Robert Millan <rmh@aybabtu.com>
>
> * conf/i386-coreboot.rmk (sbin_SCRIPTS): Add `grub-install'.
> (grub_install_SOURCES): New variable.
> * util/i386/pc/grub-install.in: Add a few condition checks to make it
> usable on coreboot.
>
> Index: conf/i386-coreboot.rmk
> ===================================================================
> --- conf/i386-coreboot.rmk (revision 1926)
> +++ conf/i386-coreboot.rmk (working copy)
> @@ -90,6 +90,9 @@ grub_emu_SOURCES = commands/boot.c comma
>
> grub_emu_LDFLAGS = $(LIBCURSES)
>
> +sbin_SCRIPTS += grub-install
> +grub_install_SOURCES = util/i386/pc/grub-install.in
> +
> # Modules.
> pkglib_MODULES = _linux.mod linux.mod normal.mod \
> _multiboot.mod multiboot.mod aout.mod \
> Index: util/i386/pc/grub-install.in
> ===================================================================
> --- util/i386/pc/grub-install.in (revision 1926)
> +++ util/i386/pc/grub-install.in (working copy)
> @@ -32,7 +32,11 @@ platform=@platform@
> pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}`
>
> grub_setup=${sbindir}/`echo grub-setup | sed ${transform}`
> +if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
> grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
> +else
> +grub_mkimage=${bindir}/`echo grub-mkelfimage | sed ${transform}`
> +fi
> grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
> grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
> rootdir=
> @@ -152,6 +156,7 @@ device_map=${grubdir}/device.map
>
> grub_probe="${grub_probe} --device-map=${device_map}"
>
> +if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
> # Check if GRUB is installed.
> set $grub_setup dummy
> if test -f "$1"; then
> @@ -160,6 +165,7 @@ else
> echo "$1: Not found." 1>&2
> exit 1
> fi
> +fi
>
> set $grub_mkimage dummy
> if test -f "$1"; then
> @@ -210,9 +216,14 @@ for file in ${grubdir}/*.mod ${grubdir}/
> rm -f $file || exit 1
> fi
> done
> -for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst ${pkglibdir}/*.img; do
> +for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst; do
> + cp -f $file ${grubdir} || exit 1
> +done
> +if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
> +for file in ${pkglibdir}/*.img; do
> cp -f $file ${grubdir} || exit 1
> done
> +fi
>
> # Write device to a variable so we don't have to traverse /dev every time.
> grub_device=`$grub_probe --target=device ${grubdir}`
> @@ -234,7 +245,12 @@ partmap_module=`$grub_probe --target=par
> devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}`
>
> # The order in this list is critical. Be careful when modifying it.
> -modules="$modules $fs_module $partmap_module biosdisk $devabstraction_module"
> +if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
> + modules="$modules biosdisk"
> +else
> + modules="$modules ata"
> +fi
> +modules="$modules $fs_module $partmap_module $devabstraction_module"
>
> prefix_drive=
> if [ "x${devabstraction_module}" = "x" ] ; then
> @@ -248,7 +264,16 @@ if [ "x${devabstraction_module}" = "x" ]
> # Strip partition number
> install_drive="`echo ${install_drive} | sed -e s/,[0-9]*//g`"
> grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*//g`"
> - if [ "x${grub_drive}" != "x${install_drive}" ] ; then
> + if [ "${target_cpu}-${platform}" != "i386-pc" ] ; then
> + # generic method (used on coreboot)
> + uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
> + if [ "x${uuid}" = "x" ] ; then
> + echo "UUID needed on this platform, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
> + exit 1
> + fi
> + prefix_drive="(UUID=${uuid})"
> + modules="$modules fs_uuid"
> + elif [ "x${grub_drive}" != "x${install_drive}" ] ; then
> uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
> if [ "x${uuid}" = "x" ] ; then
> echo "You attempted a cross-disk install, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
> @@ -266,12 +291,20 @@ if [ "x${relative_grubdir}" = "x" ] ; th
> relative_grubdir=/
> fi
>
> +if [ "${target_cpu}-${platform}" = "i386-pc" ] ; then
> +
> $grub_mkimage --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
>
> # Now perform the installation.
> $grub_setup ${setup_verbose} --directory=${grubdir} --device-map=${device_map} \
> ${install_device} || exit 1
>
> +else
> +
> +$grub_mkimage -d ${pkglibdir} --output=/boot/multiboot.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
> +
> +fi
> +
> # Prompt the user to check if the device map is correct.
> echo "Installation finished. No error reported."
> echo "This is the contents of the device map $device_map."
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
--
Robert Millan
The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
how) you may access your data; but nobody's threatening your freedom: we
still allow you to remove your data and not access it at all."
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-11-28 20:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-22 15:53 [PATCH] grub-install on coreboot Robert Millan
2008-11-28 20:06 ` Robert Millan
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.