diff --git a/.cvsignore b/.cvsignore
index e69de29..a80626b 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -0,0 +1 @@
+grub2.tar.gz
diff --git a/90_persistent b/90_persistent
new file mode 100644
index 0000000..634b177
--- /dev/null
+++ b/90_persistent
@@ -0,0 +1,36 @@
+#! /bin/sh -e
+
+# update-grub helper script.
+# Copyright (C) 2008 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 .
+
+# The output of this script is copied from part of grub.cfg
+# that correspond to itself. The achievement is that user can
+# modify that part of grub.cfg directly, and it will be persistent
+# across update-grub runs.
+
+transform="s&^&&;s,grub,grub2,"
+ME=$(echo $0 |sed 's,/,\\/,g')
+GRUBCFG=/boot/`echo grub | sed ${transform}`/grub.cfg
+
+# Exit gracefully if there's no configuration file yet
+[ -f ${GRUBCFG} ] || exit 0
+
+awk "
+ BEGIN {echo = 0}
+ /### BEGIN $ME ###/ {echo = 1; next}
+ /### END $ME ###/ {echo = 0; next}
+ {if (echo) print}
+" ${GRUBCFG}
diff --git a/grub-1.95-grubdir.patch b/grub-1.95-grubdir.patch
new file mode 100644
index 0000000..419c701
--- /dev/null
+++ b/grub-1.95-grubdir.patch
@@ -0,0 +1,17 @@
+This should ideally be done using transformations.
+Alternatively, /boot/grub may be used, no grub's files there should conflict
+with grub2 and they both can share the same device.map.
+
+Lubomir Rintel
+
+--- grub2.orig/include/grub/util/misc.h 2007-11-28 14:10:01.000000000 +0100
++++ grub2/include/grub/util/misc.h 2007-11-28 14:10:20.000000000 +0100
+@@ -28,7 +28,7 @@
+ /* NetBSD uses /boot for its boot block. */
+ # define DEFAULT_DIRECTORY "/grub"
+ #else
+-# define DEFAULT_DIRECTORY "/boot/grub"
++# define DEFAULT_DIRECTORY "/boot/grub2"
+ #endif
+
+ #define DEFAULT_DEVICE_MAP DEFAULT_DIRECTORY "/device.map"
diff --git a/grub-1.96-garbage.patch b/grub-1.96-garbage.patch
new file mode 100644
index 0000000..991ab92
--- /dev/null
+++ b/grub-1.96-garbage.patch
@@ -0,0 +1,52 @@
+http://lists.gnu.org/archive/html/grub-devel/2008-04/msg00079.html
+
+Self-explainable. Make update-grub ignore rpm leftover files and VIM
+swap files.
+
+2008-04-15 Lubomir Kundrak
+
+ * util/update-grub.in: replace the junk file switch with
+ unconditional call to grub_file_is_not_garbage
+ * util/update-grub_lib.in (grub_file_is_not_garbage): ignore
+ also rpm leftover files and editor backup files
+
+diff -urp grub-1.96.orig/util/update-grub.in grub-1.96/util/update-grub.in
+--- grub-1.96.orig/util/update-grub.in 2008-04-15 00:16:12.000000000 +0200
++++ grub-1.96/util/update-grub.in 2008-04-15 00:17:06.000000000 +0200
+@@ -145,18 +145,12 @@ cat << EOF
+ EOF
+
+ for i in ${update_grub_dir}/* ; do
+- case "$i" in
+- # emacsen backup files. FIXME: support other editors
+- *~) ;;
+- *)
+- if grub_file_is_not_garbage "$i" && test -x "$i" ; then
+- echo
+- echo "### BEGIN $i ###"
+- "$i"
+- echo "### END $i ###"
+- fi
+- ;;
+- esac
++ if grub_file_is_not_garbage "$i" && test -x "$i" ; then
++ echo
++ echo "### BEGIN $i ###"
++ "$i"
++ echo "### END $i ###"
++ fi
+ done
+
+ # none of the children aborted with error, install the new grub.cfg
+diff -urp grub-1.96.orig/util/update-grub_lib.in grub-1.96/util/update-grub_lib.in
+--- grub-1.96.orig/util/update-grub_lib.in 2008-04-15 00:16:12.000000000 +0200
++++ grub-1.96/util/update-grub_lib.in 2008-04-15 00:15:04.000000000 +0200
+@@ -115,6 +115,8 @@ grub_file_is_not_garbage ()
+ if test -f "$1" ; then
+ case "$1" in
+ *.dpkg-dist|*.dpkg-old|*.dpkg-tmp) return 1 ;; # debian dpkg
++ *.rpmnew|*.rpmsave) return 1 ;; # Fedora rpm
++ *.bak|*~|.*.swp) return 1 ;; # backup and swap files from editors
+ esac
+ else
+ return 1
diff --git a/grub-1.97-cfgmode.patch b/grub-1.97-cfgmode.patch
new file mode 100644
index 0000000..fad5ce5
--- /dev/null
+++ b/grub-1.97-cfgmode.patch
@@ -0,0 +1,17 @@
+The configuration file can potentially contain sensitive data, ...
+well, passwords are not yet implemented.
+
+Lubomir Rintel
+
+diff -urp grub2.orig/util/update-grub.in grub2/util/update-grub.in
+--- grub2.orig/util/update-grub.in 2008-08-07 21:58:17.000000000 +0200
++++ grub2/util/update-grub.in 2008-08-07 22:01:44.000000000 +0200
+@@ -170,7 +170,7 @@ exec > ${grub_cfg}.new
+
+ # Allow this to fail, since /boot/grub/ might need to be fatfs to support some
+ # firmware implementations (e.g. OFW or EFI).
+-chmod 444 ${grub_cfg}.new || true
++chmod 600 ${grub_cfg}.new || true
+
+ echo "Updating ${grub_cfg} ..." >&2
+
diff --git a/grub-1.98-linuxsort.patch b/grub-1.98-linuxsort.patch
new file mode 100644
index 0000000..84c6a49
--- /dev/null
+++ b/grub-1.98-linuxsort.patch
@@ -0,0 +1,36 @@
+Until we're able to decide which kernel to make default (e.g with grubby),
+pick the most recent one.
+
+Lubomir Rintel
+
+Index: util/grub.d/10_linux.in
+===================================================================
+--- util/grub.d/10_linux.in (revision 1797)
++++ util/grub.d/10_linux.in (working copy)
+@@ -82,23 +82,9 @@
+ return $?
+ }
+
+-find_latest ()
+-{
+- local a=""
+- for i in $@ ; do
+- if test_gt "$i" "$a" ; then
+- a="$i"
+- fi
+- done
+- echo "$a"
+-}
+-
+-list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
+- if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
+- done`
+-
+-while [ "x$list" != "x" ] ; do
+- linux=`find_latest $list`
++ls -c /boot/vmlinu[xz]-* /vmlinu[xz]-* 2>/dev/null |while read linux
++do
++ grub_file_is_not_garbage "$linux" || continue
+ echo "Found linux image: $linux" >&2
+ basename=`basename $linux`
+ dirname=`dirname $linux`
diff --git a/grub-1.98-os.patch b/grub-1.98-os.patch
new file mode 100644
index 0000000..a495c05
--- /dev/null
+++ b/grub-1.98-os.patch
@@ -0,0 +1,22 @@
+We're not GNU/Linux. Tell them.
+
+Lubomir Rintel
+
+diff -urp grub2.orig/util/grub.d/10_linux.in grub2/util/grub.d/10_linux.in
+--- grub2.orig/util/grub.d/10_linux.in 2008-08-08 07:12:30.000000000 +0200
++++ grub2/util/grub.d/10_linux.in 2008-08-08 07:12:53.000000000 +0200
+@@ -23,11 +23,9 @@ exec_prefix=@exec_prefix@
+ libdir=@libdir@
+ . ${libdir}/`echo grub | sed ${transform}`/update-grub_lib
+
+-if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
+- OS=GNU/Linux
+-else
+- OS="${GRUB_DISTRIBUTOR} GNU/Linux"
+-fi
++OS=$(sed 's/ release.*//' /etc/redhat-release)
++[ -z "$OS" ] && OS=$(uname -o)
++[ -z "$OS" ] && OS=Linux
+
+ # loop-AES arranges things so that /dev/loop/X can be our root device, but
+ # the initrds that Linux uses don't like that.
diff --git a/grub-1.98-persistent.patch b/grub-1.98-persistent.patch
new file mode 100644
index 0000000..a76d2e7
--- /dev/null
+++ b/grub-1.98-persistent.patch
@@ -0,0 +1,82 @@
+This adds a section to the configuration file that persists the updates,
+so that it's not only grub2-update itself that decides what's in the
+configuration.
+
+Lubomir Rintel
+
+diff -Nurp grub2.orig/conf/common.rmk grub2/conf/common.rmk
+--- grub2.orig/conf/common.rmk 2008-08-07 21:37:16.000000000 +0200
++++ grub2/conf/common.rmk 2008-08-08 07:14:01.000000000 +0200
+@@ -123,6 +123,12 @@ CLEANFILES += update-grub_lib
+ update-grub_SCRIPTS = 00_header 10_linux 10_hurd 10_windows 30_os-prober 40_custom
+ CLEANFILES += $(update-grub_SCRIPTS)
+
++90_persistent: util/grub.d/90_persistent.in config.status
++ ./config.status --file=$@:$<
++ chmod +x $@
++update-grub_SCRIPTS += 90_persistent
++CLEANFILES += 90_persistent
++
+ update-grub_DATA += util/grub.d/README
+
+
+diff -Nurp grub2.orig/util/grub.d/90_persistent.in grub2/util/grub.d/90_persistent.in
+--- grub2.orig/util/grub.d/90_persistent.in 1970-01-01 01:00:00.000000000 +0100
++++ grub2/util/grub.d/90_persistent.in 2008-08-08 07:14:01.000000000 +0200
+@@ -0,0 +1,37 @@
++#! /bin/sh -e
++
++# update-grub helper script.
++# Copyright (C) 2008 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 .
++
++# The output of this script is copied from part of grub.cfg
++# that correspond to itself. The achievement is that user can
++# modify that part of grub.cfg directly, and it will be persistent
++# across update-grub runs.
++
++transform="@program_transform_name@"
++
++ME=$(echo $0 |sed 's,/,\\/,g')
++GRUBCFG=/boot/`echo grub | sed ${transform}`/grub.cfg
++
++# Exit gracefully if there's no configuration file yet
++[ -f ${GRUBCFG} ] || exit 0
++
++awk "
++ BEGIN {echo = 0}
++ /### BEGIN $ME ###/ {echo = 1; next}
++ /### END $ME ###/ {echo = 0; next}
++ {if (echo) print}
++" ${GRUBCFG}
+diff -Nurp grub2.orig/util/update-grub.in grub2/util/update-grub.in
+--- grub2.orig/util/update-grub.in 2008-08-08 07:13:41.000000000 +0200
++++ grub2/util/update-grub.in 2008-08-08 07:14:01.000000000 +0200
+@@ -176,11 +176,12 @@ echo "Updating ${grub_cfg} ..." >&2
+
+ cat << EOF
+ #
+-# DO NOT EDIT THIS FILE
+-#
+-# It is automatically generated by $0 using templates
++# This is automatically generated by $0 using templates
+ # from ${update_grub_dir} and settings from ${sysconfdir}/default/grub
+ #
++# If you want your changes to persist across updates, add them
++# to 90_persistent section
++#
+ EOF
+
+ for i in ${update_grub_dir}/* ; do
diff --git a/grub-1.98-prototypes.patch b/grub-1.98-prototypes.patch
new file mode 100644
index 0000000..5b5c0bf
--- /dev/null
+++ b/grub-1.98-prototypes.patch
@@ -0,0 +1,59 @@
+According to POSIX memmove and memcpy can actually be macros or whatever
+(IIRC). We'd better not play with those in code that uses libc's headers
+and is to be linked with libc.
+
+2008-08-08 Lubomir Rintel
+
+ * include/grub/misc.h: Surround memmove and memcpy prototypes with
+ #ifndef GRUB_UTIL
+ * kern/misc.c: Surround memmove, memcpy and memset prototypes with
+ #ifndef GRUB_UTIL
+
+Index: kern/misc.c
+===================================================================
+--- kern/misc.c (revision 1797)
++++ kern/misc.c (working copy)
+@@ -44,11 +44,15 @@
+
+ return dest;
+ }
++#ifdef GRUB_UTIL
++#include
++#else
+ void *memmove (void *dest, const void *src, grub_size_t n)
+ __attribute__ ((alias ("grub_memmove")));
+ /* GCC emits references to memcpy() for struct copies etc. */
+ void *memcpy (void *dest, const void *src, grub_size_t n)
+ __attribute__ ((alias ("grub_memmove")));
++#endif
+
+ char *
+ grub_strcpy (char *dest, const char *src)
+@@ -514,8 +518,10 @@
+
+ return s;
+ }
++#ifndef GRUB_UTIL
+ void *memset (void *s, int c, grub_size_t n)
+ __attribute__ ((alias ("grub_memset")));
++#endif
+
+ grub_size_t
+ grub_strlen (const char *s)
+Index: include/grub/misc.h
+===================================================================
+--- include/grub/misc.h (revision 1797)
++++ include/grub/misc.h (working copy)
+@@ -39,8 +39,12 @@
+ char *EXPORT_FUNC(grub_strncat) (char *dest, const char *src, int c);
+
+ /* Prototypes for aliases. */
++#ifdef GRUB_UTIL
++#include
++#else
+ void *EXPORT_FUNC(memmove) (void *dest, const void *src, grub_size_t n);
+ void *EXPORT_FUNC(memcpy) (void *dest, const void *src, grub_size_t n);
++#endif
+
+ int EXPORT_FUNC(grub_memcmp) (const void *s1, const void *s2, grub_size_t n);
+ int EXPORT_FUNC(grub_strcmp) (const char *s1, const char *s2);
diff --git a/grub-1.98-transform.patch b/grub-1.98-transform.patch
new file mode 100644
index 0000000..dbc3710
--- /dev/null
+++ b/grub-1.98-transform.patch
@@ -0,0 +1,162 @@
+Transformations. Anyone, please tell upstream it's useful not to have
+them half-baked. This is so that we do not conflict with grub.
+
+Lubomir Rintel
+
+diff -urp grub2.orig/Makefile.in grub2/Makefile.in
+--- grub2.orig/Makefile.in 2008-08-07 21:37:29.000000000 +0200
++++ grub2/Makefile.in 2008-08-08 07:43:10.000000000 +0200
+@@ -215,12 +215,12 @@ install-local: all
+ dest="`echo $$file | sed 's,.*/,,' | sed '$(transform)'`"; \
+ $(INSTALL_DATA) $$dir$$file $(DESTDIR)$(sysconfdir)/grub.d/$$dest; \
+ done
+- $(mkinstalldirs) $(DESTDIR)$(libdir)/grub
++ $(mkinstalldirs) $(DESTDIR)$(libdir)/`echo grub | sed '$(transform)'`
+ @list='$(lib_DATA)'; \
+ for file in $$list; do \
+ if test -f "$$file"; then dir=; else dir="$(srcdir)/"; fi; \
+ dest="`echo $$file | sed 's,.*/,,'`"; \
+- $(INSTALL_DATA) $$dir$$file $(DESTDIR)$(libdir)/grub/$$dest; \
++ $(INSTALL_DATA) $$dir$$file $(DESTDIR)$(libdir)/`echo grub | sed '$(transform)'`/$$dest; \
+ done
+
+ install-strip:
+diff -urp grub2.orig/util/grub.d/00_header.in grub2/util/grub.d/00_header.in
+--- grub2.orig/util/grub.d/00_header.in 2008-08-07 21:37:28.000000000 +0200
++++ grub2/util/grub.d/00_header.in 2008-08-08 07:43:10.000000000 +0200
+@@ -23,7 +23,7 @@ exec_prefix=@exec_prefix@
+ libdir=@libdir@
+ grub_prefix=`echo /boot/grub | sed ${transform}`
+
+-. ${libdir}/grub/update-grub_lib
++. ${libdir}/`echo grub | sed ${transform}`/update-grub_lib
+
+ # Do this as early as possible, since other commands might depend on it.
+ # (e.g. the `font' command might need lvm or raid modules)
+diff -urp grub2.orig/util/grub.d/10_hurd.in grub2/util/grub.d/10_hurd.in
+--- grub2.orig/util/grub.d/10_hurd.in 2008-08-07 21:37:28.000000000 +0200
++++ grub2/util/grub.d/10_hurd.in 2008-08-08 07:44:29.000000000 +0200
+@@ -16,10 +16,12 @@
+ # You should have received a copy of the GNU General Public License
+ # along with GRUB. If not, see .
+
++transform="@program_transform_name@"
++
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+ libdir=@libdir@
+-. ${libdir}/grub/update-grub_lib
++. ${libdir}/`echo grub |sed ${transform}`/update-grub_lib
+
+ if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
+ OS=GNU
+diff -urp grub2.orig/util/grub.d/10_linux.in grub2/util/grub.d/10_linux.in
+--- grub2.orig/util/grub.d/10_linux.in 2008-08-07 21:37:28.000000000 +0200
++++ grub2/util/grub.d/10_linux.in 2008-08-08 07:43:10.000000000 +0200
+@@ -16,10 +16,12 @@
+ # You should have received a copy of the GNU General Public License
+ # along with GRUB. If not, see .
+
++transform="@program_transform_name@"
++
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+ libdir=@libdir@
+-. ${libdir}/grub/update-grub_lib
++. ${libdir}/`echo grub | sed ${transform}`/update-grub_lib
+
+ if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
+ OS=GNU/Linux
+diff -urp grub2.orig/util/grub.d/10_windows.in grub2/util/grub.d/10_windows.in
+--- grub2.orig/util/grub.d/10_windows.in 2008-08-07 21:37:27.000000000 +0200
++++ grub2/util/grub.d/10_windows.in 2008-08-08 07:44:13.000000000 +0200
+@@ -16,10 +16,12 @@
+ # You should have received a copy of the GNU General Public License
+ # along with GRUB. If not, see .
+
++transform="@program_transform_name@"
++
+ prefix=@prefix@
+ exec_prefix=@exec_prefix@
+ libdir=@libdir@
+-. ${libdir}/grub/update-grub_lib
++. ${libdir}/`echo grub |sed ${transform}`/update-grub_lib
+
+ case "`uname 2>/dev/null`" in
+ CYGWIN*) ;;
+diff -urp grub2.orig/util/i386/pc/grub-install.in grub2/util/i386/pc/grub-install.in
+--- grub2.orig/util/i386/pc/grub-install.in 2008-08-07 21:37:28.000000000 +0200
++++ grub2/util/i386/pc/grub-install.in 2008-08-08 07:43:10.000000000 +0200
+@@ -36,7 +36,7 @@ grub_mkimage=${bindir}/`echo grub-mkimag
+ grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
+ grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
+ rootdir=
+-grub_prefix=`echo /boot/grub | sed ${transform}`
++grub_prefix=/boot/`echo grub | sed ${transform}`
+ modules=
+
+ install_device=
+@@ -118,7 +118,7 @@ for option in "$@"; do
+ done
+
+ # for make_system_path_relative_to_its_root()
+-. ${libdir}/grub/update-grub_lib
++. ${libdir}/`echo grub | sed ${transform}`/update-grub_lib
+
+ if test "x$install_device" = x; then
+ echo "install_device not specified." 1>&2
+diff -urp grub2.orig/util/powerpc/ieee1275/grub-mkrescue.in grub2/util/powerpc/ieee1275/grub-mkrescue.in
+--- grub2.orig/util/powerpc/ieee1275/grub-mkrescue.in 2008-08-07 21:37:27.000000000 +0200
++++ grub2/util/powerpc/ieee1275/grub-mkrescue.in 2008-08-08 07:43:10.000000000 +0200
+@@ -100,7 +100,7 @@ grub.img Raw 'UNIX' 'tbxi'
+ EOF
+
+ iso_dir=`mktemp -d`
+-boot_dir=${iso_dir}/boot/grub
++boot_dir=${iso_dir}/boot/`echo grub | sed ${transform}`
+ mkdir ${iso_dir}/boot
+ mkdir ${boot_dir}
+ core_img=${boot_dir}/grub.img
+diff -urp grub2.orig/util/update-grub.in grub2/util/update-grub.in
+--- grub2.orig/util/update-grub.in 2008-08-07 21:37:28.000000000 +0200
++++ grub2/util/update-grub.in 2008-08-08 07:43:10.000000000 +0200
+@@ -23,7 +23,7 @@ exec_prefix=@exec_prefix@
+ sbindir=@sbindir@
+ libdir=@libdir@
+ sysconfdir=@sysconfdir@
+-grub_prefix=`echo /boot/grub | sed ${transform}`
++grub_prefix=/boot/`echo /grub | sed ${transform}`
+ grub_cfg=${grub_prefix}/grub.cfg
+ update_grub_dir=${sysconfdir}/grub.d
+
+@@ -65,7 +65,7 @@ for option in "$@"; do
+ esac
+ done
+
+-. ${libdir}/grub/update-grub_lib
++. ${libdir}/`echo grub | sed ${transform}`/update-grub_lib
+
+ if [ "x$EUID" = "x" ] ; then
+ EUID=`id -u`
+@@ -107,7 +107,7 @@ fi
+ mkdir -p ${grub_prefix}
+
+ if test -e ${grub_prefix}/device.map ; then : ; else
+- grub-mkdevicemap
++ ${grub_mkdevicemap}
+ fi
+
+ # Device containing our userland. Typically used for root= parameter.
+diff -urp grub2.orig/util/update-grub_lib.in grub2/util/update-grub_lib.in
+--- grub2.orig/util/update-grub_lib.in 2008-08-07 21:37:28.000000000 +0200
++++ grub2/util/update-grub_lib.in 2008-08-08 07:43:10.000000000 +0200
+@@ -145,7 +145,8 @@ prepare_grub_to_access_device ()
+
+ font_path ()
+ {
+- for dir in ${pkgdatadir} /boot/grub /usr/share/grub ; do
++ for dir in ${pkgdatadir} ${pkgdatadir}/`echo grub | sed ${transform}` \
++ /boot/`echo grub | sed ${transform}`; do
+ # FIXME: We prefer ascii because loading complete fonts is too slow (and
+ # we don't yet provide the gettext magic that would make unicode useful).
+ for basename in ascii unicode unifont ; do
diff --git a/grub.default b/grub.default
new file mode 100644
index 0000000..08f5349
--- /dev/null
+++ b/grub.default
@@ -0,0 +1 @@
+GRUB_CMDLINE_LINUX="quiet rhgb"
diff --git a/grub2-dlsym-v4.patch b/grub2-dlsym-v4.patch
new file mode 100644
index 0000000..8e35246
--- /dev/null
+++ b/grub2-dlsym-v4.patch
@@ -0,0 +1,30 @@
+2008-05-07: Lubomir Rintel
+
+ * kern/dl.c (grub_dl_resolve_symbols): Let the
+ grub_gdb_trapvec symbol be resolved correctly (instead of 0).
+
+--- grub2/kern/dl.c 2008-01-26 21:34:58.000000000 +0100
++++ grub2-gdb/kern/dl.c 2008-05-07 09:27:08.000000000 +0200
+@@ -352,16 +352,18 @@ grub_dl_resolve_symbols (grub_dl_t mod,
+ {
+ case STT_NOTYPE:
+ /* Resolve a global symbol. */
+- if (sym->st_name != 0 && sym->st_shndx == 0)
++ if (sym->st_name == 0)
++ break;
++
++ if (sym->st_shndx == 0) /* external */
+ {
+ sym->st_value = (Elf_Addr) grub_dl_resolve_symbol (name);
+ if (! sym->st_value)
+ return grub_error (GRUB_ERR_BAD_MODULE,
+ "the symbol `%s' not found", name);
+- }
+- else
+- sym->st_value = 0;
+ break;
++ }
++ /* nonexternal, same as STT_OBJECT */
+
+ case STT_OBJECT:
+ sym->st_value += (Elf_Addr) grub_dl_get_section_addr (mod,
diff --git a/grub2-preserve-symbols-v4.1.patch b/grub2-preserve-symbols-v4.1.patch
new file mode 100644
index 0000000..2d7e15b
--- /dev/null
+++ b/grub2-preserve-symbols-v4.1.patch
@@ -0,0 +1,38 @@
+2008-05-07: Lubomir Rintel
+
+ * genmk.rb: replace strip with objcopy, so unstripped files are
+ left untouched for debugging purposes.
+
+diff -urp grub2.orig/genmk.rb grub2/genmk.rb
+--- grub2.orig/genmk.rb 2008-08-07 21:37:29.000000000 +0200
++++ grub2/genmk.rb 2008-08-07 23:31:19.000000000 +0200
+@@ -101,10 +101,11 @@ class PModule
+ mod_obj = mod_src.suffix('o')
+ defsym = 'def-' + @name.suffix('lst')
+ undsym = 'und-' + @name.suffix('lst')
++ exec = @name.suffix('elf')
+ mod_name = File.basename(@name, '.mod')
+ symbolic_name = mod_name.sub(/\.[^\.]*$/, '')
+
+- "CLEANFILES += #{@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} #{undsym}
++ "CLEANFILES += #{@name} #{mod_obj} #{mod_src} #{pre_obj} #{objs_str} #{undsym} #{exec}
+ ifneq ($(#{prefix}_EXPORTS),no)
+ CLEANFILES += #{defsym}
+ DEFSYMFILES += #{defsym}
+@@ -112,11 +113,14 @@ endif
+ MOSTLYCLEANFILES += #{deps_str}
+ UNDSYMFILES += #{undsym}
+
+-#{@name}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF)
++#{@name}: #{exec}
++ -rm -f $@
++ $(OBJCOPY) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $^ $@
++
++#{exec}: #{pre_obj} #{mod_obj} $(TARGET_OBJ2ELF)
+ -rm -f $@
+ $(TARGET_CC) $(#{prefix}_LDFLAGS) $(TARGET_LDFLAGS) $(MODULE_LDFLAGS) -Wl,-r,-d -o $@ #{pre_obj} #{mod_obj}
+ if test ! -z $(TARGET_OBJ2ELF); then ./$(TARGET_OBJ2ELF) $@ || (rm -f $@; exit 1); fi
+- $(STRIP) --strip-unneeded -K grub_mod_init -K grub_mod_fini -K _grub_mod_init -K _grub_mod_fini -R .note -R .comment $@
+
+ #{pre_obj}: $(#{prefix}_DEPENDENCIES) #{objs_str}
+ -rm -f $@
diff --git a/grub2.spec b/grub2.spec
new file mode 100644
index 0000000..b51f20e
--- /dev/null
+++ b/grub2.spec
@@ -0,0 +1,266 @@
+# Modules always contain just 32-bit code
+%define _libdir %{_exec_prefix}/lib
+
+# 64bit machines use 32bit boot loader
+# (We cannot just redefine _target_cpu, as we'd get i386.rpm packages then)
+%ifarch x86_64
+%define _target_platform i386-%{_vendor}-%{_target_os}%{?_gnu}
+%endif
+
+# Hack to include debuginfo for files, that find-debuginfo.sh wouldn't
+# have spot, because they're either no longer ELF images, such as
+# boot images, or are brutally and insensitively stripped, such as
+# modules. See %%install.
+# It's certainly not the nicest thing you've ever seen.
+# THAT IS NOT MY FAULT.
+# We do not use find-debuginfo.sh -o here, as it's not supported in RHEL5
+%define __debug_install_post \
+ \
+ # Gather debuginfo as usual \
+ /usr/lib/rpm/find-debuginfo.sh \\\
+ %{_builddir}/%{?buildsubdir} \
+ mv debugfiles.list debug1.list \
+ \
+ # Gather debuginfo of modules from shadow build root \
+ RPM_BUILD_ROOT=%{_builddir}/%{?buildsubdir}/.debugroot \\\
+ /usr/lib/rpm/find-debuginfo.sh \\\
+ %{_builddir}/%{?buildsubdir} \
+ mv debugfiles.list debug2.list \
+ \
+ # Merge debuginfos \
+ cp -a %{_builddir}/%{?buildsubdir}/.debugroot/usr/lib/debug \\\
+ $RPM_BUILD_ROOT/usr/lib \
+ cp -a %{_builddir}/%{?buildsubdir}/.debugroot/usr/src/debug \\\
+ $RPM_BUILD_ROOT/usr/src \
+ sort debug1.list debug2.list |uniq >debugfiles.list \
+ \
+ %{nil}
+
+Name: grub2
+Version: 1.98
+Release: 0.2.20080807svn%{?dist}
+Summary: Bootloader with support for Linux, Multiboot and more
+
+Group: System Environment/Base
+License: GPLv3+
+URL: http://www.gnu.org/software/grub/
+#Source0: http://alpha.gnu.org/pub/gnu/grub/grub-%{version}.tar.gz
+# svn -r1797 co svn://svn.sv.gnu.org/grub/trunk/grub2
+# tar czf grub2.tar.gz --exclude .svn grub2
+Source0: grub2.tar.gz
+Source1: 90_persistent
+Source2: grub.default
+Patch1: grub-1.98-prototypes.patch
+Patch2: grub-1.98-transform.patch
+Patch4: grub-1.95-grubdir.patch
+Patch5: grub-1.98-os.patch
+Patch6: grub-1.97-cfgmode.patch
+Patch7: grub-1.96-garbage.patch
+Patch8: grub-1.98-persistent.patch
+Patch9: grub-1.98-linuxsort.patch
+Patch10: http://fedorapeople.org/~lkundrak/grub2/grub2-dlsym-v4.patch
+#Patch13: http://fedorapeople.org/~lkundrak/grub2/grub2-preserve-symbols-v4.patch
+Patch13: grub2-preserve-symbols-v4.1.patch
+
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+
+BuildRequires: flex bison ruby binutils
+BuildRequires: ncurses-devel lzo-devel
+BuildRequires: /usr/lib/crt1.o
+
+# grubby
+Requires(pre): mkinitrd
+Requires(post): mkinitrd
+
+# TODO: ppc and sparc
+ExclusiveArch: %{ix86} x86_64
+
+%description
+This is the second version of the GRUB (Grand Unified Bootloader),
+a highly configurable and customizable bootloader with modular
+architecture. It support rich scale of kernel formats, file systems,
+computer architectures and hardware devices.
+
+
+%prep
+%setup -q -n grub2
+
+%patch1 -p0 -b .prototypes
+%patch2 -p1 -b .transform
+%patch4 -p1 -b .grubdir
+%patch5 -p1 -b .os
+%patch6 -p1 -b .cfgmode
+%patch7 -p1 -b .garbage
+%patch8 -p1 -b .persistent
+%patch9 -p0 -b .linuxsort
+%patch10 -p1 -b .dlsym
+%patch13 -p1 -b .preserve-symbols
+
+
+%build
+# -static is needed so that autoconf script is able to link
+# test that looks for _start symbol on 64 bit platforms
+%configure TARGET_LDFLAGS=-static \
+ --with-platform=pc \
+ --enable-grub-emu \
+ --program-transform-name=s,grub,%{name},
+# TODO: Other platforms. Use alternatives system?
+# --with-platform=ieee1275 \
+# --with-platform=efi \
+# --with-platform=i386-pc \
+
+
+#make %{?_smp_mflags}
+#gcc -Inormal -I./normal -I. -Iinclude -I./include -Wall -W -DGRUB_LIBDIR=\"/usr/lib/`echo grub/i386-pc | sed 's&^&&;s,grub,grub2,'`\" -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -DGRUB_UTIL=1 -MD -c -o grub_emu-normal_lexer.o normal/lexer.c
+#In file included from normal/lexer.c:23:
+#include/grub/script.h:26:29: error: grub_script.tab.h: No such file or directory
+make
+
+
+%install
+set -e
+rm -fr $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
+
+# Script that makes part of grub.cfg persist across updates
+install -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/grub.d/
+
+# Ghost config file
+install -d $RPM_BUILD_ROOT/boot/%{name}
+touch $RPM_BUILD_ROOT/boot/%{name}/grub.cfg
+ln -s ../boot/%{name}/grub.cfg $RPM_BUILD_ROOT%{_sysconfdir}/%{name}.cfg
+
+# Install ELF files modules and images were created from into
+# the shadow root, where debuginfo generator will grab them from
+find $RPM_BUILD_ROOT -name '*.mod' -o -name '*.img' |
+while read MODULE
+do
+ BASE=$(echo $MODULE |sed -r "s,.*/([^/]*)\.(mod|img),\1,")
+ # Symbols from .img files are in .exec files, while .mod
+ # modules store symbols in .elf. This is just because we
+ # have both boot.img and boot.mod ...
+ EXT=$(echo $MODULE |grep -q '.mod' && echo '.elf' || echo '.exec')
+ TGT=$(echo $MODULE |sed "s,$RPM_BUILD_ROOT,.debugroot,")
+ install -m 755 -D $BASE$EXT $TGT
+done
+
+# Defaults
+install -m 644 -D %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/default/grub
+
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+
+%post
+exec >/dev/null 2>&1
+# Create device.map or reuse one from GRUB Legacy
+cp -u /boot/grub/device.map /boot/%{name}/device.map 2>/dev/null ||
+ %{name}-mkdevicemap
+# Determine the partition with /boot
+BOOT_PARTITION=$(df -h /boot |(read; awk '{print $1; exit}'))
+# Generate core.img, but don't let it be installed in boot sector
+%{name}-install --grub-setup=/bin/true $BOOT_PARTITION
+# Remove stale menu.lst entries
+/sbin/grubby --remove-kernel=/boot/%{name}/core.img
+# Add core.img as multiboot kernel to GRUB Legacy menu
+/sbin/grubby --add-kernel=/boot/%{name}/core.img --title="GNU GRUB 2, (%{version})"
+
+
+%preun
+exec >/dev/null
+/sbin/grubby --remove-kernel=/boot/%{name}/core.img
+# XXX Ugly
+rm -f /boot/%{name}/*.mod
+rm -f /boot/%{name}/*.img
+rm -f /boot/%{name}/*.lst
+rm -f /boot/%{name}/device.map
+
+
+%triggerin -- kernel, kernel-PAE
+exec >/dev/null 2>&1
+# Generate grub.cfg
+update-%{name}
+
+
+%triggerun -- kernel, kernel-PAE
+exec >/dev/null 2>&1
+# Generate grub.cfg
+update-%{name}
+
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/%{name}
+%{_sbindir}/%{name}-mkdevicemap
+%{_sbindir}/%{name}-install
+%{_sbindir}/%{name}-emu
+%{_sbindir}/%{name}-probe
+%{_sbindir}/%{name}-setup
+%{_sbindir}/update-%{name}
+%{_bindir}/%{name}-mkimage
+%{_bindir}/%{name}-mkrescue
+%{_bindir}/%{name}-editenv
+%{_bindir}/%{name}-pe2elf
+%dir %{_sysconfdir}/grub.d
+%config %{_sysconfdir}/grub.d/??_*
+%{_sysconfdir}/grub.d/README
+%{_sysconfdir}/%{name}.cfg
+%{_sysconfdir}/default/grub
+%dir /boot/%{name}
+# Actually, this is replaced by update-grub from scriptlets,
+# but it takes care of modified persistent part
+%config(noreplace) /boot/%{name}/grub.cfg
+%doc COPYING INSTALL NEWS README THANKS TODO ChangeLog
+%exclude %{_mandir}
+
+
+%changelog
+* Fri Aug 08 2008 Lubomir Rintel - 1.98-0.2.20080807svn
+- Correct scriptlet dependencies, trigger on kernel-PAE (thanks to Till Maas)
+- Fix build on x86_64 (thanks to Marek Mahut)
+
+* Thu Aug 07 2008 Lubomir Rintel 1.98-0.1.20080807svn
+- Another snapshot
+- And much more!
+
+* Mon May 12 2008 Lubomir Kundrak 1.97-0.1.20080512cvs
+- CVS snapshot
+- buildid patch upstreamed
+
+* Sat Apr 12 2008 Lubomir Kundrak 1.96-2
+- Pull in 32 bit glibc
+- Fix builds on 64 bit
+
+* Sun Mar 16 2008 Lubomir Kundrak 1.96-1
+- New upstream release
+- More transformation fixes
+- Generate -debuginfo from modules again. This time for real.
+- grubby stub
+- Make it possible to do configuration changes directly in grub.cfg
+- grub.cfg symlink in /etc
+
+* Thu Feb 14 2008 Lubomir Kundrak 1.95.cvs20080214-3
+- Update to latest trunk
+- Manual pages
+- Add pci.c to DISTLIST
+
+* Mon Nov 26 2007 Lubomir Kundrak 1.95.cvs20071119-2
+- Fix program name transformation in utils
+- Moved the modules to /lib
+- Generate -debuginfo from modules again
+
+* Sun Nov 18 2007 Lubomir Kundrak 1.95.cvs20071119-1
+- Synchronized with CVS, major specfile cleanup
+
+* Mon Jan 30 2007 Lubomir Kundrak 1.95-lkundrak1
+- Removed redundant filelist entries
+
+* Mon Jan 29 2007 Lubomir Kundrak 1.95-lkundrak0
+- Program name transformation
+- Bump to 1.95
+- grub-probefs -> grub-probe
+- Add modules to -debuginfo
+
+* Tue Sep 12 2006 Lubomir Kundrak 1.94-lkundrak0
+- built the package
diff --git a/import.log b/import.log
new file mode 100644
index 0000000..b359870
--- /dev/null
+++ b/import.log
@@ -0,0 +1 @@
+grub2-1_98-0_2_20080807svn_el5:HEAD:grub2-1.98-0.2.20080807svn.el5.src.rpm:1219824412
diff --git a/sources b/sources
index e69de29..75eaf92 100644
--- a/sources
+++ b/sources
@@ -0,0 +1 @@
+e900ada389acd04b579583cb2179ef61 grub2.tar.gz