From e39a88ed81cbb4f4ddb9f1de4d0497ff7db908d7 Mon Sep 17 00:00:00 2001
From: James Meyer <james.meyer@operamail.com>
Date: Mon, 6 Aug 2012 21:30:28 -0500
Subject: grub 2 -drops grub 1 and replaced with grub2

---
 abs/core/grub/040_all_grub-0.96-nxstack.patch     | 623 ----------------------
 abs/core/grub/05-grub-0.97-initrdaddr.diff        |  16 -
 abs/core/grub/20_memtest86+                       |  29 +
 abs/core/grub/PKGBUILD                            | 312 ++++++++---
 abs/core/grub/__changelog                         |   1 +
 abs/core/grub/archlinux_grub_mkconfig_fixes.patch | 143 +++++
 abs/core/grub/ext4.patch                          | 263 ---------
 abs/core/grub/grub-0.97-gpt.patch                 | 315 -----------
 abs/core/grub/grub-inode-size.patch               |  94 ----
 abs/core/grub/grub.cfg                            | 139 +++++
 abs/core/grub/grub.default                        |  47 ++
 abs/core/grub/grub.install                        |  33 +-
 abs/core/grub/grub_bzr_export.sh                  | 113 ++++
 abs/core/grub/i2o.patch                           |  45 --
 abs/core/grub/install-grub                        | 543 -------------------
 abs/core/grub/install-grub.orig                   | 187 -------
 abs/core/grub/intelmac.patch                      |  67 ---
 abs/core/grub/menu.lst                            |  48 --
 abs/core/grub/more-raid.patch                     | 100 ----
 abs/core/grub/special-devices.patch               |  18 -
 20 files changed, 737 insertions(+), 2399 deletions(-)
 delete mode 100644 abs/core/grub/040_all_grub-0.96-nxstack.patch
 delete mode 100644 abs/core/grub/05-grub-0.97-initrdaddr.diff
 create mode 100644 abs/core/grub/20_memtest86+
 create mode 100644 abs/core/grub/__changelog
 create mode 100644 abs/core/grub/archlinux_grub_mkconfig_fixes.patch
 delete mode 100644 abs/core/grub/ext4.patch
 delete mode 100644 abs/core/grub/grub-0.97-gpt.patch
 delete mode 100644 abs/core/grub/grub-inode-size.patch
 create mode 100644 abs/core/grub/grub.cfg
 create mode 100644 abs/core/grub/grub.default
 create mode 100644 abs/core/grub/grub_bzr_export.sh
 delete mode 100644 abs/core/grub/i2o.patch
 delete mode 100644 abs/core/grub/install-grub
 delete mode 100755 abs/core/grub/install-grub.orig
 delete mode 100644 abs/core/grub/intelmac.patch
 delete mode 100644 abs/core/grub/menu.lst
 delete mode 100644 abs/core/grub/more-raid.patch
 delete mode 100644 abs/core/grub/special-devices.patch

diff --git a/abs/core/grub/040_all_grub-0.96-nxstack.patch b/abs/core/grub/040_all_grub-0.96-nxstack.patch
deleted file mode 100644
index 121941c..0000000
--- a/abs/core/grub/040_all_grub-0.96-nxstack.patch
+++ /dev/null
@@ -1,623 +0,0 @@
-Fix NX segfaulting on amd64.
-
-Patch by Peter Jones.
-
-http://lists.gnu.org/archive/html/bug-grub/2005-03/msg00011.html
-
---- grub-0.97/grub/asmstub.c
-+++ grub-0.97/grub/asmstub.c
-@@ -42,6 +42,7 @@
- #include <sys/time.h>
- #include <termios.h>
- #include <signal.h>
-+#include <sys/mman.h>
- 
- #ifdef __linux__
- # include <sys/ioctl.h>		/* ioctl */
-@@ -79,7 +80,7 @@
- struct apm_info apm_bios_info;
- 
- /* Emulation requirements. */
--char *grub_scratch_mem = 0;
-+void *grub_scratch_mem = 0;
- 
- struct geometry *disks = 0;
- 
-@@ -103,14 +104,62 @@
- static unsigned int serial_speed;
- #endif /* SIMULATE_SLOWNESS_OF_SERIAL */
- 
-+/* This allocates page-aligned storage of the specified size, which must be
-+ * a multiple of the page size as determined by calling sysconf(_SC_PAGESIZE)
-+ */
-+#ifdef __linux__
-+static void *
-+grub_mmap_alloc(size_t len)
-+{
-+  int mmap_flags = MAP_ANONYMOUS|MAP_PRIVATE|MAP_EXECUTABLE;
-+
-+#ifdef MAP_32BIT
-+  mmap_flags |= MAP_32BIT;
-+#endif
-+  /* Mark the simulated stack executable, as GCC uses stack trampolines
-+   * to implement nested functions. */
-+  return mmap(NULL, len, PROT_READ|PROT_WRITE|PROT_EXEC, mmap_flags, -1, 0);
-+}
-+#else /* !defined(__linux__) */
-+static void *
-+grub_mmap_alloc(size_t len)
-+{
-+  int fd = 0, offset = 0, ret = 0;
-+  void *pa = MAP_FAILED; 
-+  char template[] = "/tmp/grub_mmap_alloc_XXXXXX";
-+  errno_t e;
-+
-+  fd = mkstemp(template);
-+  if (fd < 0)
-+    return pa;
-+
-+  unlink(template);
-+
-+  ret = ftruncate(fd, len);
-+  if (ret < 0)
-+    return pa;
-+
-+  /* Mark the simulated stack executable, as GCC uses stack trampolines
-+   * to implement nested functions. */
-+  pa = mmap(NULL, len, PROT_READ|PROT_WRITE|PROT_EXEC,
-+                  MAP_PRIVATE|MAP_EXECUTABLE, fd, offset);
-+
-+  e = errno;
-+  close(fd);
-+  errno = e;
-+  return pa;
-+}
-+#endif /* defined(__linux__) */
-+
- /* The main entry point into this mess. */
- int
- grub_stage2 (void)
- {
-   /* These need to be static, because they survive our stack transitions. */
-   static int status = 0;
--  static char *realstack;
--  char *scratch, *simstack;
-+  static void *realstack;
-+  void *simstack_alloc_base, *simstack;
-+  size_t simstack_size, page_size;
-   int i;
- 
-   /* We need a nested function so that we get a clean stack frame,
-@@ -140,9 +189,35 @@
-   }
- 
-   assert (grub_scratch_mem == 0);
--  scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);
--  assert (scratch);
--  grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);
-+
-+  /* Allocate enough pages for 0x100000 + EXTENDED_SIZE + 15, and
-+   * make sure the memory is aligned to a multiple of the system's
-+   * page size */
-+  page_size = sysconf (_SC_PAGESIZE);
-+  simstack_size = ( 0x100000 + EXTENDED_MEMSIZE + 15);
-+  if (simstack_size % page_size)
-+    {
-+      /* If we're not on a page_size boundary, round up to the next one */
-+      simstack_size &= ~(page_size-1);
-+      simstack_size += page_size;
-+    }
-+
-+  /* Add one for a PROT_NONE boundary page at each end. */
-+  simstack_size += 2 * page_size;
-+
-+  simstack_alloc_base = grub_mmap_alloc(simstack_size);
-+  assert (simstack_alloc_base != MAP_FAILED);
-+
-+  /* mark pages above and below our simstack area as innaccessable.
-+   * If the implementation we're using doesn't support that, then the
-+   * new protection modes are undefined.  It's safe to just ignore
-+   * them, though.  It'd be nice if we knew that we'd get a SEGV for
-+   * touching the area, but that's all.  it'd be nice to have. */
-+  mprotect (simstack_alloc_base, page_size, PROT_NONE);
-+  mprotect ((void *)((unsigned long)simstack_alloc_base +
-+                         simstack_size - page_size),  page_size, PROT_NONE);
-+
-+  grub_scratch_mem = (void *)((unsigned long)simstack_alloc_base + page_size);
- 
-   /* FIXME: simulate the memory holes using mprot, if available. */
- 
-@@ -215,7 +290,7 @@
-   device_map = 0;
-   free (disks);
-   disks = 0;
--  free (scratch);
-+  munmap(simstack_alloc_base, simstack_size);
-   grub_scratch_mem = 0;
- 
-   if (serial_device)
---- grub-0.97/stage2/builtins.c
-+++ grub-0.97/stage2/builtins.c
-@@ -131,63 +131,98 @@
- }
- 
- 
-+/* blocklist_read_helper nee disk_read_blocklist_func was a nested
-+ * function, to which pointers were taken and exposed globally.  Even
-+ * in the GNU-C nested functions extension, they have local linkage,
-+ * and aren't guaranteed to be accessable *at all* outside of their 
-+ * containing scope.
-+ *
-+ * Above and beyond all of that, the variables within blocklist_func_context
-+ * are originally local variables, with local (not even static) linkage,
-+ * from within blocklist_func.  These were each referenced by
-+ * disk_read_blocklist_func, which is only called from other functions
-+ * through a globally scoped pointer.
-+ * 
-+ * The documentation in GCC actually uses the words "all hell will break
-+ * loose" to describe this scenario.
-+ *
-+ * Also, "start_sector" was also used uninitialized, but gcc doesn't warn
-+ * about it (possibly because of the scoping madness?)
-+ */
-+   
-+static struct {
-+       int start_sector;
-+       int num_sectors;
-+       int num_entries;
-+       int last_length;
-+} blocklist_func_context = {
-+       .start_sector = 0,
-+       .num_sectors = 0,
-+       .num_entries = 0,
-+       .last_length = 0
-+};
-+
-+/* Collect contiguous blocks into one entry as many as possible,
-+   and print the blocklist notation on the screen.  */
-+static void
-+blocklist_read_helper (int sector, int offset, int length)
-+{
-+  int *start_sector = &blocklist_func_context.start_sector;
-+  int *num_sectors = &blocklist_func_context.num_sectors;
-+  int *num_entries = &blocklist_func_context.num_entries;
-+  int *last_length = &blocklist_func_context.last_length;
-+
-+  if (*num_sectors > 0)
-+  {
-+    if (*start_sector + *num_sectors == sector
-+      && offset == 0 && *last_length == SECTOR_SIZE)
-+    {
-+      *num_sectors++;
-+      *last_length = length;
-+      return;
-+    }
-+    else
-+    {
-+      if (*last_length == SECTOR_SIZE)
-+        grub_printf ("%s%d+%d", *num_entries ? "," : "",
-+          *start_sector - part_start, *num_sectors);
-+      else if (*num_sectors > 1)
-+        grub_printf ("%s%d+%d,%d[0-%d]", *num_entries ? "," : "",
-+          *start_sector - part_start, *num_sectors-1,
-+          *start_sector + *num_sectors-1 - part_start, 
-+          *last_length);
-+      else
-+        grub_printf ("%s%d[0-%d]", *num_entries ? "," : "",
-+          *start_sector - part_start, *last_length);
-+      *num_entries++;
-+      *num_sectors = 0;
-+    }
-+  }
-+
-+  if (offset > 0)
-+  {
-+    grub_printf("%s%d[%d-%d]", *num_entries ? "," : "",
-+          sector-part_start, offset, offset+length);
-+    *num_entries++;
-+  }
-+  else
-+  {
-+    *start_sector = sector;
-+    *num_sectors = 1;
-+    *last_length = length;
-+  }
-+}
-+
- /* blocklist */
- static int
- blocklist_func (char *arg, int flags)
- {
-   char *dummy = (char *) RAW_ADDR (0x100000);
--  int start_sector;
--  int num_sectors = 0;
--  int num_entries = 0;
--  int last_length = 0;
--
--  auto void disk_read_blocklist_func (int sector, int offset, int length);
--  
--  /* Collect contiguous blocks into one entry as many as possible,
--     and print the blocklist notation on the screen.  */
--  auto void disk_read_blocklist_func (int sector, int offset, int length)
--    {
--      if (num_sectors > 0)
--	{
--	  if (start_sector + num_sectors == sector
--	      && offset == 0 && last_length == SECTOR_SIZE)
--	    {
--	      num_sectors++;
--	      last_length = length;
--	      return;
--	    }
--	  else
--	    {
--	      if (last_length == SECTOR_SIZE)
--		grub_printf ("%s%d+%d", num_entries ? "," : "",
--			     start_sector - part_start, num_sectors);
--	      else if (num_sectors > 1)
--		grub_printf ("%s%d+%d,%d[0-%d]", num_entries ? "," : "",
--			     start_sector - part_start, num_sectors-1,
--			     start_sector + num_sectors-1 - part_start, 
--			     last_length);
--	      else
--		grub_printf ("%s%d[0-%d]", num_entries ? "," : "",
--			     start_sector - part_start, last_length);
--	      num_entries++;
--	      num_sectors = 0;
--	    }
--	}
--
--      if (offset > 0)
--	{
--	  grub_printf("%s%d[%d-%d]", num_entries ? "," : "",
--		      sector-part_start, offset, offset+length);
--	  num_entries++;
--	}
--      else
--	{
--	  start_sector = sector;
--	  num_sectors = 1;
--	  last_length = length;
--	}
--    }
- 
-+  int *start_sector = &blocklist_func_context.start_sector;
-+  int *num_sectors = &blocklist_func_context.num_sectors;
-+  int *num_entries = &blocklist_func_context.num_entries;
-+  
-   /* Open the file.  */
-   if (! grub_open (arg))
-     return 1;
-@@ -204,15 +241,15 @@
-   grub_printf (")");
- 
-   /* Read in the whole file to DUMMY.  */
--  disk_read_hook = disk_read_blocklist_func;
-+  disk_read_hook = blocklist_read_helper;
-   if (! grub_read (dummy, -1))
-     goto fail;
- 
-   /* The last entry may not be printed yet.  Don't check if it is a
-    * full sector, since it doesn't matter if we read too much. */
--  if (num_sectors > 0)
--    grub_printf ("%s%d+%d", num_entries ? "," : "",
--		 start_sector - part_start, num_sectors);
-+  if (*num_sectors > 0)
-+	grub_printf ("%s%d+%d", *num_entries ? "," : "",
-+                *start_sector - part_start, *num_sectors);
- 
-   grub_printf ("\n");
-   
-@@ -1868,6 +1905,77 @@
- 
- 
- /* install */
-+static struct {
-+       int saved_sector;
-+       int installaddr;
-+       int installlist;
-+       char *stage2_first_buffer;
-+} install_func_context = {
-+       .saved_sector = 0,
-+       .installaddr = 0,
-+       .installlist = 0,
-+       .stage2_first_buffer = NULL,
-+};
-+
-+/* Save the first sector of Stage2 in STAGE2_SECT.  */
-+/* Formerly disk_read_savesect_func with local scope inside install_func */
-+static void
-+install_savesect_helper(int sector, int offset, int length)
-+{
-+  if (debug)
-+    printf ("[%d]", sector);
-+
-+  /* ReiserFS has files which sometimes contain data not aligned
-+     on sector boundaries.  Returning an error is better than
-+     silently failing. */
-+  if (offset != 0 || length != SECTOR_SIZE)
-+    errnum = ERR_UNALIGNED;
-+
-+  install_func_context.saved_sector = sector;
-+}
-+
-+/* Write SECTOR to INSTALLLIST, and update INSTALLADDR and  INSTALLSECT.  */
-+/* Formerly disk_read_blocklist_func with local scope inside install_func */
-+static void
-+install_blocklist_helper (int sector, int offset, int length)
-+{
-+  int *installaddr = &install_func_context.installaddr;
-+  int *installlist = &install_func_context.installlist;
-+  char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
-+  /* Was the last sector full? */
-+  static int last_length = SECTOR_SIZE;
-+
-+  if (debug)
-+    printf("[%d]", sector);
-+
-+  if (offset != 0 || last_length != SECTOR_SIZE)
-+    {
-+      /* We found a non-sector-aligned data block. */
-+      errnum = ERR_UNALIGNED;
-+      return;
-+    }
-+
-+  last_length = length;
-+
-+  if (*((unsigned long *) (*installlist - 4))
-+      + *((unsigned short *) *installlist) != sector
-+      || *installlist == (int) *stage2_first_buffer + SECTOR_SIZE + 4)
-+    {
-+      *installlist -= 8;
-+
-+      if (*((unsigned long *) (*installlist - 8)))
-+        errnum = ERR_WONT_FIT;
-+      else
-+        {
-+          *((unsigned short *) (*installlist + 2)) = (*installaddr >> 4);
-+          *((unsigned long *) (*installlist - 4)) = sector;
-+        }
-+    }
-+
-+  *((unsigned short *) *installlist) += 1;
-+  *installaddr += 512;
-+}
-+
- static int
- install_func (char *arg, int flags)
- {
-@@ -1875,8 +1983,12 @@
-   char *stage1_buffer = (char *) RAW_ADDR (0x100000);
-   char *stage2_buffer = stage1_buffer + SECTOR_SIZE;
-   char *old_sect = stage2_buffer + SECTOR_SIZE;
--  char *stage2_first_buffer = old_sect + SECTOR_SIZE;
--  char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE;
-+  /* stage2_first_buffer used to be defined as:
-+   * char *stage2_first_buffer = old_sect + SECTOR_SIZE;  */
-+  char **stage2_first_buffer = &install_func_context.stage2_first_buffer;
-+  /* and stage2_second_buffer was:
-+   * char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE; */
-+  char *stage2_second_buffer = old_sect + SECTOR_SIZE + SECTOR_SIZE;
-   /* XXX: Probably SECTOR_SIZE is reasonable.  */
-   char *config_filename = stage2_second_buffer + SECTOR_SIZE;
-   char *dummy = config_filename + SECTOR_SIZE;
-@@ -1885,10 +1997,11 @@
-   int src_drive, src_partition, src_part_start;
-   int i;
-   struct geometry dest_geom, src_geom;
--  int saved_sector;
-+  int *saved_sector = &install_func_context.saved_sector;
-   int stage2_first_sector, stage2_second_sector;
-   char *ptr;
--  int installaddr, installlist;
-+  int *installaddr = &install_func_context.installaddr;
-+  int *installlist = &install_func_context.installlist;
-   /* Point to the location of the name of a configuration file in Stage 2.  */
-   char *config_file_location;
-   /* If FILE is a Stage 1.5?  */
-@@ -1897,67 +2010,13 @@
-   int is_open = 0;
-   /* If LBA is forced?  */
-   int is_force_lba = 0;
--  /* Was the last sector full? */
--  int last_length = SECTOR_SIZE;
--  
-+
-+  *stage2_first_buffer = old_sect + SECTOR_SIZE;
- #ifdef GRUB_UTIL
-   /* If the Stage 2 is in a partition mounted by an OS, this will store
-      the filename under the OS.  */
-   char *stage2_os_file = 0;
- #endif /* GRUB_UTIL */
--  
--  auto void disk_read_savesect_func (int sector, int offset, int length);
--  auto void disk_read_blocklist_func (int sector, int offset, int length);
--  
--  /* Save the first sector of Stage2 in STAGE2_SECT.  */
--  auto void disk_read_savesect_func (int sector, int offset, int length)
--    {
--      if (debug)
--	printf ("[%d]", sector);
--
--      /* ReiserFS has files which sometimes contain data not aligned
--         on sector boundaries.  Returning an error is better than
--         silently failing. */
--      if (offset != 0 || length != SECTOR_SIZE)
--	errnum = ERR_UNALIGNED;
--
--      saved_sector = sector;
--    }
--
--  /* Write SECTOR to INSTALLLIST, and update INSTALLADDR and
--     INSTALLSECT.  */
--  auto void disk_read_blocklist_func (int sector, int offset, int length)
--    {
--      if (debug)
--	printf("[%d]", sector);
--
--      if (offset != 0 || last_length != SECTOR_SIZE)
--	{
--	  /* We found a non-sector-aligned data block. */
--	  errnum = ERR_UNALIGNED;
--	  return;
--	}
--
--      last_length = length;
--
--      if (*((unsigned long *) (installlist - 4))
--	  + *((unsigned short *) installlist) != sector
--	  || installlist == (int) stage2_first_buffer + SECTOR_SIZE + 4)
--	{
--	  installlist -= 8;
--
--	  if (*((unsigned long *) (installlist - 8)))
--	    errnum = ERR_WONT_FIT;
--	  else
--	    {
--	      *((unsigned short *) (installlist + 2)) = (installaddr >> 4);
--	      *((unsigned long *) (installlist - 4)) = sector;
--	    }
--	}
--
--      *((unsigned short *) installlist) += 1;
--      installaddr += 512;
--    }
- 
-   /* First, check the GNU-style long option.  */
-   while (1)
-@@ -1987,10 +2049,10 @@
-   addr = skip_to (0, file);
- 
-   /* Get the installation address.  */
--  if (! safe_parse_maxint (&addr, &installaddr))
-+  if (! safe_parse_maxint (&addr, installaddr))
-     {
-       /* ADDR is not specified.  */
--      installaddr = 0;
-+      *installaddr = 0;
-       ptr = addr;
-       errnum = 0;
-     }
-@@ -2084,17 +2146,17 @@
-     = (dest_drive & BIOS_FLAG_FIXED_DISK);
-   
-   /* Read the first sector of Stage 2.  */
--  disk_read_hook = disk_read_savesect_func;
--  if (grub_read (stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
-+  disk_read_hook = install_savesect_helper;
-+  if (grub_read (*stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
-     goto fail;
- 
--  stage2_first_sector = saved_sector;
-+  stage2_first_sector = *saved_sector;
-   
-   /* Read the second sector of Stage 2.  */
-   if (grub_read (stage2_second_buffer, SECTOR_SIZE) != SECTOR_SIZE)
-     goto fail;
- 
--  stage2_second_sector = saved_sector;
-+  stage2_second_sector = *saved_sector;
-   
-   /* Check for the version of Stage 2.  */
-   if (*((short *) (stage2_second_buffer + STAGE2_VER_MAJ_OFFS))
-@@ -2110,27 +2172,27 @@
- 
-   /* If INSTALLADDR is not specified explicitly in the command-line,
-      determine it by the Stage 2 id.  */
--  if (! installaddr)
-+  if (! *installaddr)
-     {
-       if (! is_stage1_5)
- 	/* Stage 2.  */
--	installaddr = 0x8000;
-+	*installaddr = 0x8000;
-       else
- 	/* Stage 1.5.  */
--	installaddr = 0x2000;
-+	*installaddr = 0x2000;
-     }
- 
-   *((unsigned long *) (stage1_buffer + STAGE1_STAGE2_SECTOR))
-     = stage2_first_sector;
-   *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_ADDRESS))
--    = installaddr;
-+    = *installaddr;
-   *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_SEGMENT))
--    = installaddr >> 4;
-+    = *installaddr >> 4;
- 
--  i = (int) stage2_first_buffer + SECTOR_SIZE - 4;
-+  i = (int) *stage2_first_buffer + SECTOR_SIZE - 4;
-   while (*((unsigned long *) i))
-     {
--      if (i < (int) stage2_first_buffer
-+      if (i < (int) *stage2_first_buffer
- 	  || (*((int *) (i - 4)) & 0x80000000)
- 	  || *((unsigned short *) i) >= 0xA00
- 	  || *((short *) (i + 2)) == 0)
-@@ -2144,13 +2206,13 @@
-       i -= 8;
-     }
- 
--  installlist = (int) stage2_first_buffer + SECTOR_SIZE + 4;
--  installaddr += SECTOR_SIZE;
-+  *installlist = (int) *stage2_first_buffer + SECTOR_SIZE + 4;
-+  *installaddr += SECTOR_SIZE;
-   
-   /* Read the whole of Stage2 except for the first sector.  */
-   grub_seek (SECTOR_SIZE);
- 
--  disk_read_hook = disk_read_blocklist_func;
-+  disk_read_hook = install_blocklist_helper;
-   if (! grub_read (dummy, -1))
-     goto fail;
-   
-@@ -2233,7 +2295,7 @@
- 	  /* Skip the first sector.  */
- 	  grub_seek (SECTOR_SIZE);
- 	  
--	  disk_read_hook = disk_read_savesect_func;
-+	  disk_read_hook = install_savesect_helper;
- 	  if (grub_read (stage2_buffer, SECTOR_SIZE) != SECTOR_SIZE)
- 	    goto fail;
- 	  
-@@ -2303,7 +2365,7 @@
- 	  else
- #endif /* GRUB_UTIL */
- 	    {
--	      if (! devwrite (saved_sector - part_start, 1, stage2_buffer))
-+	      if (! devwrite (*saved_sector - part_start, 1, stage2_buffer))
- 		goto fail;
- 	    }
- 	}
-@@ -2325,7 +2387,7 @@
- 	  goto fail;
- 	}
- 
--      if (fwrite (stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
-+      if (fwrite (*stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
- 	{
- 	  fclose (fp);
- 	  errnum = ERR_WRITE;
-@@ -2352,7 +2414,7 @@
- 	goto fail;
- 
-       if (! devwrite (stage2_first_sector - src_part_start, 1,
--		      stage2_first_buffer))
-+		      *stage2_first_buffer))
- 	goto fail;
- 
-       if (! devwrite (stage2_second_sector - src_part_start, 1,
---- grub-0.97/stage2/shared.h
-+++ grub-0.97/stage2/shared.h
-@@ -36,8 +36,8 @@
- 
- /* Maybe redirect memory requests through grub_scratch_mem. */
- #ifdef GRUB_UTIL
--extern char *grub_scratch_mem;
--# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem)
-+extern void *grub_scratch_mem;
-+# define RAW_ADDR(x) ((x) + (unsigned long) grub_scratch_mem)
- # define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4)
- #else
- # define RAW_ADDR(x) (x)
diff --git a/abs/core/grub/05-grub-0.97-initrdaddr.diff b/abs/core/grub/05-grub-0.97-initrdaddr.diff
deleted file mode 100644
index ccf5f3e..0000000
--- a/abs/core/grub/05-grub-0.97-initrdaddr.diff
+++ /dev/null
@@ -1,16 +0,0 @@
---- grub-0.96/stage2/boot.c
-+++ grub-0.96/stage2/boot.c
-@@ -824,8 +824,11 @@
-     moveto = (mbi.mem_upper + 0x400) << 10;
-   
-   moveto = (moveto - len) & 0xfffff000;
--  max_addr = (lh->header == LINUX_MAGIC_SIGNATURE && lh->version >= 0x0203
--	      ? lh->initrd_addr_max : LINUX_INITRD_MAX_ADDRESS);
-+  max_addr = LINUX_INITRD_MAX_ADDRESS;
-+  if (lh->header == LINUX_MAGIC_SIGNATURE &&
-+      lh->version >= 0x0203 &&
-+      lh->initrd_addr_max < max_addr)
-+    max_addr = lh->initrd_addr_max;
-   if (moveto + len >= max_addr)
-     moveto = (max_addr - len) & 0xfffff000;
-   
diff --git a/abs/core/grub/20_memtest86+ b/abs/core/grub/20_memtest86+
new file mode 100644
index 0000000..1d3096f
--- /dev/null
+++ b/abs/core/grub/20_memtest86+
@@ -0,0 +1,29 @@
+#! /bin/sh -e
+########################################################
+# This script generates a memtest86+ entry on grub.cfg #
+# if memtest is installed on the system.               #
+########################################################
+
+prefix="/usr"
+exec_prefix="${prefix}"
+
+datarootdir="/usr/share"
+datadir="${datarootdir}"
+
+. "${datadir}/grub/grub-mkconfig_lib"
+
+MEMTEST86_IMAGE="/boot/memtest86+/memtest.bin"
+CLASS="--class memtest86 --class gnu --class tool"
+
+if [ -e $MEMTEST86_IMAGE ] && is_path_readable_by_grub $MEMTEST86_IMAGE; then
+  # image exists, create menu entry
+  echo "Found memtest86+ image: $MEMTEST86_IMAGE" >&2
+  cat << EOF
+menuentry "Memory test (memtest86+)" $CLASS {
+EOF
+  prepare_grub_to_access_device `${grub_probe} --target=device $MEMTEST86_IMAGE` | sed -e "s/^/  /"
+  cat << EOF
+  linux16 (\$root)`make_system_path_relative_to_its_root $MEMTEST86_IMAGE`
+}
+EOF
+fi
diff --git a/abs/core/grub/PKGBUILD b/abs/core/grub/PKGBUILD
index 38c6a28..1bf094b 100644
--- a/abs/core/grub/PKGBUILD
+++ b/abs/core/grub/PKGBUILD
@@ -1,75 +1,249 @@
-# $Id: PKGBUILD 22874 2008-12-29 18:25:08Z tpowa $
 # Maintainer: Ronald van Haren <ronald.archlinux.org>
+# Contributor: Keshav P R <(the.ridikulus.rat) (aatt) (gemmaeiil) (ddoott) (ccoomm)>
 
-pkgname=grub
-pkgver=0.97
-pkgrel=31
-pkgdesc="A GNU multiboot boot loader"
+_grub_lua_ver=24
+_grub_ntldr_ver=21
+_grub_915_ver=9
+
+pkgname=('grub-common' 'grub-bios' 'grub-efi-i386')
+pkgbase=grub
+pkgver=2.00
+pkgrel=1
+url="https://www.gnu.org/software/grub/"
 arch=('i686' 'x86_64')
-license=('GPL')
-url="http://www.gnu.org/software/grub/"
-groups=('base')
-depends=('ncurses' 'diffutils' 'sed')
-source=(ftp://alpha.gnu.org/gnu/grub/grub-$pkgver.tar.gz
-        menu.lst
-        install-grub
-        040_all_grub-0.96-nxstack.patch
-        05-grub-0.97-initrdaddr.diff
-        i2o.patch
-        special-devices.patch
-        more-raid.patch
-        intelmac.patch
-        grub-inode-size.patch
-	ext4.patch)
-backup=('boot/grub/menu.lst')
-install=grub.install
+license=('GPL3')
+makedepends=('xz' 'bdf-unifont' 'ttf-dejavu' 'python2' 'autogen'
+             'texinfo' 'help2man' 'gettext' 'device-mapper' 'fuse')
+
+source=("http://ftp.gnu.org/gnu/grub/grub-${pkgver}.tar.xz"
+        "ftp://ftp.archlinux.org/other/grub2/grub2_extras_lua_r${_grub_lua_ver}.tar.xz"
+        "ftp://ftp.archlinux.org/other/grub2/grub2_extras_ntldr-img_r${_grub_ntldr_ver}.tar.xz"
+        "ftp://ftp.archlinux.org/other/grub2/grub2_extras_915resolution_r${_grub_915_ver}.tar.xz"
+        'archlinux_grub_mkconfig_fixes.patch'
+        'grub.default'
+        'grub.cfg'
+        '20_memtest86+'
+        'grub_bzr_export.sh')
+
+noextract=("grub2_extras_lua_r${_grub_lua_ver}.tar.xz"
+           "grub2_extras_ntldr-img_r${_grub_ntldr_ver}.tar.xz"
+           "grub2_extras_915resolution_r${_grub_915_ver}.tar.xz")
+
+sha1sums=('274d91e96b56a5b9dd0a07accff69dbb6dfb596b'
+          '89290031b974780c6df76893836d2477d4add895'
+          'eb4b35b4c36b64f9405cbcbc538cb205171c1c0a'
+          'd5ae2efec25616028a9d89e98b6e454f1c4c415f'
+          '26e4e946190bea1f03632658cf08ba90e11dec57'
+          'dbf493dec4722feb11f0b5c71ad453a18daf0fc5'
+          '76ae862a945a8848e6999adf8ad1847f0f7008b9'
+          'ce35d7ae75cd1b5b677e894e528f96add40e77b9'
+          '0cfd4e51cdb14a92f06cfd3c607f2aa21f3e55fc')
+
+_build_grub-common_and_bios() {
+
+	## copy the source for building the common/bios package
+	cp -r "${srcdir}/grub-${pkgver}" "${srcdir}/grub_bios-${pkgver}"
+	cd "${srcdir}/grub_bios-${pkgver}"
+        #sed -i -e '/gets is a security/d' grub-core/gnulib/stdio.in.h
+	## Apply Archlinux specific fixes to enable grub-mkconfig detect Arch kernels and initramfs
+	patch -Np1 -i "${srcdir}/archlinux_grub_mkconfig_fixes.patch"
+	echo
+
+	## fix unifont.bdf location so that grub-mkfont can create *.pf2 files
+	sed 's|/usr/share/fonts/unifont|/usr/share/fonts/unifont /usr/share/fonts/misc|g' -i "${srcdir}/grub_bios-${pkgver}/configure.ac"
+
+	## fix DejaVuSans.ttf location so that grub-mkfont can create *.pf2 files for starfield theme
+	sed 's|/usr/share/fonts/dejavu|/usr/share/fonts/dejavu /usr/share/fonts/TTF|g' -i "${srcdir}/grub_bios-${pkgver}/configure.ac"
+
+	## add the grub-extra sources
+	export GRUB_CONTRIB="${srcdir}/grub_bios-${pkgver}/grub-extras/"
+	install -d "${srcdir}/grub_bios-${pkgver}/grub-extras"
+
+	bsdtar xf "${srcdir}/grub2_extras_lua_r${_grub_lua_ver}.tar.xz" \
+		-C "${srcdir}/grub_bios-${pkgver}/grub-extras"
+
+	bsdtar xf "${srcdir}/grub2_extras_ntldr-img_r${_grub_ntldr_ver}.tar.xz" \
+		-C "${srcdir}/grub_bios-${pkgver}/grub-extras"
+
+	bsdtar xf "${srcdir}/grub2_extras_915resolution_r${_grub_915_ver}.tar.xz" \
+		-C "${srcdir}/grub_bios-${pkgver}/grub-extras"
+
+	## Requires python2
+	 sed 's|python |python2 |g' -i "${srcdir}/grub_bios-${pkgver}/autogen.sh"
+
+	## start the actual build process
+	cd "${srcdir}/grub_bios-${pkgver}"
+	./autogen.sh
+	echo
+
+	CFLAGS="" ./configure \
+		--with-platform="pc" \
+		--target="i386" \
+		--host="${CARCH}-unknown-linux-gnu" \
+		"${_EFIEMU}" \
+		--enable-mm-debug \
+		--enable-nls \
+		--enable-device-mapper \
+		--enable-cache-stats \
+		--enable-grub-mkfont \
+		--enable-grub-mount \
+		--prefix="/usr" \
+		--bindir="/usr/bin" \
+		--sbindir="/usr/sbin" \
+		--mandir="/usr/share/man" \
+		--infodir="/usr/share/info" \
+		--datarootdir="/usr/share" \
+		--sysconfdir="/etc" \
+		--program-prefix="" \
+		--with-bootdir="/boot" \
+		--with-grubdir="grub" \
+		--disable-werror
+	echo
+
+	CFLAGS="" make
+	echo
+
+}
+
+_build_grub-efi-i386() {
+
+	## copy the source for building the efi package
+	cp -r "${srcdir}/grub-${pkgver}" "${srcdir}/grub_efi-${pkgver}"
+	cd "${srcdir}/grub_efi-${pkgver}"
+        #sed -i -e '/gets is a security/d' grub-core/gnulib/stdio.in.h
+	export GRUB_CONTRIB="${srcdir}/grub_efi-${pkgver}/grub-extras/"
+	install -d "${srcdir}/grub_efi-${pkgver}/grub-extras"
+
+	bsdtar xf "${srcdir}/grub2_extras_lua_r${_grub_lua_ver}.tar.xz" \
+		-C "${srcdir}/grub_efi-${pkgver}/grub-extras"
+
+	cd "${srcdir}/grub_efi-${pkgver}"
+	./autogen.sh
+	echo
+
+	CFLAGS="" ./configure \
+		--with-platform="efi" \
+		--target="i386" \
+		--host="${CARCH}-unknown-linux-gnu" \
+		--disable-efiemu \
+		--enable-mm-debug \
+		--enable-nls \
+		--enable-device-mapper \
+		--enable-cache-stats \
+		--enable-grub-mkfont \
+		--enable-grub-mount \
+		--prefix="/usr" \
+		--bindir="/usr/bin" \
+		--sbindir="/usr/sbin" \
+		--mandir="/usr/share/man" \
+		--infodir="/usr/share/info" \
+		--datarootdir="/usr/share" \
+		--sysconfdir="/etc" \
+		--program-prefix="" \
+		--with-bootdir="/boot" \
+		--with-grubdir="grub" \
+		--disable-werror
+	echo
+
+	CFLAGS="" make
+	echo
+
+}
 
 build() {
-  cd $srcdir/$pkgname-$pkgver
-
-  #set destination architecture here
-  DESTARCH="i686"
-  #DESTARCH="x86_64"
-  # optimizations break the build -- disable them
-  # adding special devices to grub, patches are from fedora
-  patch -Np1 -i ../special-devices.patch || return 1
-  patch -Np1 -i ../i2o.patch || return 1
-  patch -Np1 -i ../more-raid.patch || return 1
-  patch -Np1 -i ../intelmac.patch || return 1
-  # Add support for bigger inode size to e2fs_stage1_5
-  patch -Np1 -i ../grub-inode-size.patch || return 1
-  # Add ext4 support
-  # http://www.mail-archive.com/bug-grub@gnu.org/msg11458.html
-  patch -Np1 -i ../ext4.patch || return 1
-
-  #arch64 fixes for static build
-  if [ "$CARCH" = "x86_64" ]; then
-    echo "this package has to be built on i686, won't compile on x86_64"
-    sleep 5
-  else
-    if [ "$DESTARCH" = "x86_64" ]; then
-      # patch from gentoo for fixing a segfault
-      patch -Np1 -i ../040_all_grub-0.96-nxstack.patch || return 1
-      # patch from frugalware to make it boot when more than 2GB ram installed
-      patch -Np1 -i ../05-grub-0.97-initrdaddr.diff || return 1
-      CFLAGS="-static" ./configure --prefix=/usr --bindir=/bin --sbindir=/sbin \
-                           --mandir=/usr/share/man --infodir=/usr/share/info
-    else
-      CFLAGS= ./configure --prefix=/usr --bindir=/bin --sbindir=/sbin \
-                  --mandir=/usr/share/man --infodir=/usr/share/info
-    fi
-  fi
-
-  CFLAGS= make || return 1
-  make DESTDIR=$pkgdir install || return 1
-  install -D -m644 ../menu.lst $startdir/pkg/boot/grub/menu.lst
-  install -D -m755 ../install-grub $startdir/pkg/sbin/install-grub
- 
-  rm -f $pkgdir/usr/share/info/dir || return 1
-  gzip /$pkgdir/usr/share/info/*
-
-  if [ "$DESTARCH" = "x86_64" ]; then
-    # fool makepkg into building a x86_64 package
-    export CARCH="x86_64"
-  fi
+
+	## set architecture dependent variables
+	if [[ "${CARCH}" == 'x86_64' ]]; then
+		_EFIEMU="--enable-efiemu"
+	else
+		_EFIEMU="--disable-efiemu"
+	fi
+
+	_HOST="${CARCH}"
+
+	cd "${srcdir}/grub-${pkgver}"
+	# _get_locale_files
+        sed -i -e '/gets is a security/d' grub-core/gnulib/stdio.in.h
+	_build_grub-common_and_bios
+	echo
+
+	_build_grub-efi-i386
+	echo
+
+}
+
+package_grub-common() {
+
+	pkgdesc="GNU GRand Unified Bootloader - Utilities and Common Files"
+	depends=('sh' 'xz' 'freetype2' 'gettext' 'device-mapper' 'fuse')
+	conflicts=('grub-legacy' 'grub')
+	replaces=('grub2-common')
+	provides=('grub2-common')
+	backup=('boot/grub/grub.cfg' 'etc/default/grub' 'etc/grub.d/40_custom')
+	optdepends=('libisoburn: provides xorriso for generating grub rescue iso using grub-mkrescue'
+	            'os-prober: to detect other OSes when generating grub.cfg in BIOS systems'
+	            'mtools: for grub-mkrescue FAT FS support')
+	install="grub.install"
+	options=('strip' 'purge' 'docs' 'zipman' '!emptydirs')
+
+	cd "${srcdir}/grub_bios-${pkgver}"
+	make DESTDIR="${pkgdir}/" bashcompletiondir="/usr/share/bash-completion/completions" install
+	echo
+
+	## install extra /etc/grub.d/ files
+	install -D -m0755 "${srcdir}/20_memtest86+" "${pkgdir}/etc/grub.d/20_memtest86+"
+
+	## install /etc/default/grub (used by grub-mkconfig)
+	install -D -m0644 "${srcdir}/grub.default" "${pkgdir}/etc/default/grub"
+
+	## install grub.cfg (needed so it doesn't get removed on upgrading because it was previously here)
+	install -D -m0644 "${srcdir}/grub.cfg" "${pkgdir}/boot/grub/grub.cfg"
+
+	# remove platform specific files
+	rm -rf "${pkgdir}/usr/lib/grub/i386-pc/"
+
+}
+
+package_grub-bios() {
+
+	pkgdesc="GNU GRand Unified Bootloader - i386 PC BIOS Modules"
+	depends=("grub-common=${pkgver}")
+	options=('!strip' '!emptydirs')
+	replaces=('grub2-bios')
+	provides=('grub2-bios')
+
+	cd "${srcdir}/grub_bios-${pkgver}"
+	make DESTDIR="${pkgdir}/" install
+	echo
+
+	## remove non platform-specific files
+	rm -rf "${pkgdir}"/{boot,etc,usr/{share,bin,sbin}}
+
+	## remove gdb debugging related files
+	rm -f "${pkgdir}/usr/lib/grub/i386-pc"/*.module || true
+	rm -f "${pkgdir}/usr/lib/grub/i386-pc"/*.image || true
+	rm -f "${pkgdir}/usr/lib/grub/i386-pc"/{kernel.exec,gdb_grub,gmodule.pl} || true
+
+}
+
+package_grub-efi-i386() {
+
+	pkgdesc="GNU GRand Unified Bootloader - i386 UEFI Modules"
+	depends=("grub-common=${pkgver}" 'dosfstools' 'efibootmgr')
+	options=('!strip' '!emptydirs')
+	replaces=('grub2-efi-i386')
+	provides=('grub2-efi-i386')
+
+	cd "${srcdir}/grub_efi-${pkgver}"
+	make DESTDIR="${pkgdir}/" install
+	echo
+
+	## remove non platform-specific files
+	rm -rf "${pkgdir}"/{boot,etc,usr/{share,bin,sbin}}
+
+	## remove gdb debugging related files
+	rm -f "${pkgdir}/usr/lib/grub/i386-efi"/*.module || true
+	rm -f "${pkgdir}/usr/lib/grub/i386-efi"/*.image || true
+	rm -f "${pkgdir}/usr/lib/grub/i386-efi"/{kernel.exec,gdb_grub,gmodule.pl} || true
+
 }
diff --git a/abs/core/grub/__changelog b/abs/core/grub/__changelog
new file mode 100644
index 0000000..0be82a4
--- /dev/null
+++ b/abs/core/grub/__changelog
@@ -0,0 +1 @@
+ -e '/gets is a security/d' grub-core/gnulib/stdio.in.h
diff --git a/abs/core/grub/archlinux_grub_mkconfig_fixes.patch b/abs/core/grub/archlinux_grub_mkconfig_fixes.patch
new file mode 100644
index 0000000..c8bd3e4
--- /dev/null
+++ b/abs/core/grub/archlinux_grub_mkconfig_fixes.patch
@@ -0,0 +1,143 @@
+diff --git a/util/grub-mkconfig.in b/util/grub-mkconfig.in
+index 516be86..5f37db2 100644
+--- a/util/grub-mkconfig.in
++++ b/util/grub-mkconfig.in
+@@ -213,6 +213,8 @@ export GRUB_DEFAULT \
+   GRUB_THEME \
+   GRUB_GFXPAYLOAD_LINUX \
+   GRUB_DISABLE_OS_PROBER \
++  GRUB_COLOR_NORMAL \
++  GRUB_COLOR_HIGHLIGHT \
+   GRUB_INIT_TUNE \
+   GRUB_SAVEDEFAULT \
+   GRUB_ENABLE_CRYPTODISK \
+diff --git a/util/grub.d/00_header.in b/util/grub.d/00_header.in
+index 765bfdc..b148558 100644
+--- a/util/grub.d/00_header.in
++++ b/util/grub.d/00_header.in
+@@ -115,6 +115,14 @@ cat <<EOF
+ 
+ EOF
+ 
++if [ x$GRUB_COLOR_NORMAL != x ] && [ x$GRUB_COLOR_HIGHLIGHT != x ] ; then
++    cat << EOF
++set menu_color_normal=$GRUB_COLOR_NORMAL
++set menu_color_highlight=$GRUB_COLOR_HIGHLIGHT
++
++EOF
++fi
++
+ serial=0;
+ gfxterm=0;
+ for x in ${GRUB_TERMINAL_INPUT} ${GRUB_TERMINAL_OUTPUT}; do
+diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in
+index 14402e8..64c9bb5 100644
+--- a/util/grub.d/10_linux.in
++++ b/util/grub.d/10_linux.in
+@@ -87,6 +87,8 @@ linux_entry ()
+       case $type in
+ 	  recovery)
+ 	      title="$(gettext_printf "%s, with Linux %s (recovery mode)" "${os}" "${version}")" ;;
++	  fallback)
++	      title="$(gettext_printf "%s, with Linux %s (Fallback initramfs)" "${os}" "${version}")" ;;
+ 	  *)
+ 	      title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;;
+       esac
+@@ -100,7 +102,7 @@ linux_entry ()
+   else
+       echo "menuentry '$(echo "$os" | grub_quote)' ${CLASS} \$menuentry_id_option 'gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
+   fi      
+-  if [ x$type != xrecovery ] ; then
++  if [ x$type != xrecovery ] && [ x$type != xfallback ] ; then
+       save_default_entry | sed -e "s/^/\t/"
+   fi
+ 
+@@ -132,7 +134,8 @@ linux_entry ()
+     fi
+     printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
+   fi
+-  message="$(gettext_printf "Loading Linux %s ..." ${version})"
++
++  message="$(gettext_printf "Loading Linux %s ..." "${version}")"
+   sed "s/^/$submenu_indentation/" << EOF
+ 	echo	'$message'
+ 	linux	${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro ${args}
+@@ -190,7 +193,22 @@ while [ "x$list" != "x" ] ; do
+   alt_version=`echo $version | sed -e "s,\.old$,,g"`
+   linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
+ 
++  if test -e "/etc/arch-release" ; then
++    if echo "${basename}" | grep -q 'vmlinuz-linux' ; then
++      version="`echo "${basename}" | sed -e 's,vmlinuz-linux,,g'`"
++      
++      if [ "x${version}" = "x" ] ; then
++        version="core repo kernel"
++      else
++        version="`echo "${version}" | sed -e 's,-,,g'`"
++        version="${version} kernel"
++      fi
++    fi
++  fi
++  
+   initrd=
++  initrd_arch="`echo "${basename}" | sed -e 's,vmlinuz,initramfs,g'`"
++
+   for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
+ 	   "initrd-${version}" "initramfs-${version}.img" \
+ 	   "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
+@@ -198,7 +216,8 @@ while [ "x$list" != "x" ] ; do
+ 	   "initramfs-genkernel-${version}" \
+ 	   "initramfs-genkernel-${alt_version}" \
+ 	   "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
+-	   "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}"; do
++	   "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}" \
++	   "${initrd_arch}.img" ; do
+     if test -e "${dirname}/${i}" ; then
+       initrd="$i"
+       break
+@@ -226,6 +245,22 @@ while [ "x$list" != "x" ] ; do
+     linux_root_device_thisversion=${GRUB_DEVICE}
+   fi
+ 
++  if test -e "/etc/arch-release" ; then
++    is_first_entry="false"
++    
++    linux_entry "${OS}" "${version}" true \
++              "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
++    
++    for i in "${initrd_arch}-fallback.img" "initramfs-${version}-fallback.img" ; do
++      if test -e "${dirname}/${i}" ; then
++        initrd="${i}"
++        linux_entry "${OS}" "${version}" fallback \
++                    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
++        break
++      fi
++    done
++  fi
++
+   if [ "x$is_first_entry" = xtrue ]; then
+     linux_entry "${OS}" "${version}" simple \
+     "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
+@@ -239,8 +274,11 @@ while [ "x$list" != "x" ] ; do
+     echo "submenu '$(gettext_printf "Advanced options for %s" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
+   fi
+ 
++  if ! test -e "/etc/arch-release" ; then
+   linux_entry "${OS}" "${version}" advanced \
+               "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"
++  fi
++
+   if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
+     linux_entry "${OS}" "${version}" recovery \
+                 "single ${GRUB_CMDLINE_LINUX}"
+@@ -252,8 +290,10 @@ done
+ 
+ # If at least one kernel was found, then we need to
+ # add a closing '}' for the submenu command.
++if ! test -e "/etc/arch-release" ; then
+ if [ x"$is_first_entry" != xtrue ]; then
+   echo '}'
+ fi
++fi
+ 
+ echo "$title_correction_code"
diff --git a/abs/core/grub/ext4.patch b/abs/core/grub/ext4.patch
deleted file mode 100644
index 8a2f9bd..0000000
--- a/abs/core/grub/ext4.patch
+++ /dev/null
@@ -1,263 +0,0 @@
-diff -ruNp grub-0.97/stage2/fsys_ext2fs.c grub-0.97-patch/stage2/fsys_ext2fs.c
---- grub-0.97/stage2/fsys_ext2fs.c      2004-08-08 20:19:18.000000000 +0200
-+++ grub-0.97-patch/stage2/fsys_ext2fs.c        2007-12-29 16:25:19.000000000 
-+0100
-@@ -51,6 +51,9 @@ typedef unsigned int __u32;
- #define EXT2_TIND_BLOCK                 (EXT2_DIND_BLOCK + 1)
- #define EXT2_N_BLOCKS                   (EXT2_TIND_BLOCK + 1)
- 
-+/* Inode flags */
-+#define EXT4_EXTENTS_FL                 0x00080000 /* Inode uses extents */
-+
- /* include/linux/ext2_fs.h */
- struct ext2_super_block
-   {
-@@ -191,6 +194,42 @@ struct ext2_dir_entry
- #define EXT2_DIR_REC_LEN(name_len)      (((name_len) + 8 + EXT2_DIR_ROUND) & \
-                                          ~EXT2_DIR_ROUND)
- 
-+/* linux/ext4_fs_extents.h */
-+/*
-+ * This is the extent on-disk structure.
-+ * It's used at the bottom of the tree.
-+ */
-+struct ext4_extent {
-+    __u32 ee_block;       /* first logical block extent covers */
-+    __u16 ee_len;         /* number of blocks covered by extent */
-+    __u16 ee_start_hi;    /* high 16 bits of physical block */
-+    __u32 ee_start;       /* low 32 bits of physical block */
-+};
-+
-+/*
-+ * This is index on-disk structure.
-+ * It's used at all the levels except the bottom.
-+ */
-+struct ext4_extent_idx {
-+    __u32 ei_block;       /* index covers logical blocks from 'block' */
-+    __u32 ei_leaf;        /* pointer to the physical block of the next *
-+                                 * level. leaf or next index could be there */
-+    __u16 ei_leaf_hi;     /* high 16 bits of physical block */
-+    __u16 ei_unused;
-+};
-+
-+/*
-+ * Each block (leaves and indexes), even inode-stored has header.
-+ */
-+struct ext4_extent_header {
-+    __u16  eh_magic;       /* probably will support different formats */
-+    __u16  eh_entries;     /* number of valid entries */
-+    __u16  eh_max;         /* capacity of store in entries */
-+    __u16  eh_depth;       /* has tree real underlying blocks? */
-+    __u32  eh_generation;  /* generation of the tree */
-+};
-+
-+#define EXT4_EXT_MAGIC          0xf30a
- 
- /* ext2/super.c */
- #define log2(n) ffz(~(n))
-@@ -279,6 +318,26 @@ ext2_rdfsb (int fsblock, int buffer)
-                  EXT2_BLOCK_SIZE (SUPERBLOCK), (char *) buffer);
- }
- 
-+/* Walk through extents index tree to find the good leaf */
-+static struct ext4_extent_header * 
-+ext4_recurse_extent_index(struct ext4_extent_header *extent_block, int logical_block)
-+{
-+  int i;
-+  struct ext4_extent_idx *index = (struct ext4_extent_idx *) (extent_block + 1);
-+  if (extent_block->eh_magic != EXT4_EXT_MAGIC)
-+    return NULL;
-+  if (extent_block->eh_depth == 0)
-+    return extent_block;
-+  for (i = 0; i < extent_block->eh_entries; i++)
-+    {
-+      if (logical_block < index[i].ei_block)
-+        break;
-+    }
-+  if (i == 0 || !ext2_rdfsb(index[i-1].ei_leaf, DATABLOCK1))
-+    return NULL;
-+  return (ext4_recurse_extent_index((struct ext4_extent_header *) DATABLOCK1, logical_block));
-+}
-+
- /* from
-   ext2/inode.c:ext2_bmap()
- */
---- grub-0.97/stage2/fsys_ext2fs.c~	2008-12-28 20:19:00.000000000 +0100
-+++ grub-0.97/stage2/fsys_ext2fs.c	2008-12-28 20:19:00.000000000 +0100
-@@ -366,83 +366,106 @@
-     }
-   printf ("logical block %d\n", logical_block);
- #endif /* E2DEBUG */
--
--  /* if it is directly pointed to by the inode, return that physical addr */
--  if (logical_block < EXT2_NDIR_BLOCKS)
--    {
--#ifdef E2DEBUG
--      printf ("returning %d\n", (unsigned char *) (INODE->i_block[logical_block]));
--      printf ("returning %d\n", INODE->i_block[logical_block]);
--#endif /* E2DEBUG */
--      return INODE->i_block[logical_block];
--    }
--  /* else */
--  logical_block -= EXT2_NDIR_BLOCKS;
--  /* try the indirect block */
--  if (logical_block < EXT2_ADDR_PER_BLOCK (SUPERBLOCK))
-+  /* standard ext2 inode */
-+  if (!(INODE->i_flags & EXT4_EXTENTS_FL))
-     {
--      if (mapblock1 != 1
--	  && !ext2_rdfsb (INODE->i_block[EXT2_IND_BLOCK], DATABLOCK1))
--	{
--	  errnum = ERR_FSYS_CORRUPT;
--	  return -1;
--	}
--      mapblock1 = 1;
--      return ((__u32 *) DATABLOCK1)[logical_block];
--    }
--  /* else */
--  logical_block -= EXT2_ADDR_PER_BLOCK (SUPERBLOCK);
--  /* now try the double indirect block */
--  if (logical_block < (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2)))
--    {
--      int bnum;
--      if (mapblock1 != 2
--	  && !ext2_rdfsb (INODE->i_block[EXT2_DIND_BLOCK], DATABLOCK1))
--	{
--	  errnum = ERR_FSYS_CORRUPT;
--	  return -1;
--	}
--      mapblock1 = 2;
--      if ((bnum = (((__u32 *) DATABLOCK1)
--		   [logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)]))
--	  != mapblock2
--	  && !ext2_rdfsb (bnum, DATABLOCK2))
--	{
--	  errnum = ERR_FSYS_CORRUPT;
--	  return -1;
--	}
--      mapblock2 = bnum;
-+      /* if it is directly pointed to by the inode, return that physical addr */
-+      if (logical_block < EXT2_NDIR_BLOCKS)
-+        {
-+#ifdef E2DEBUG
-+          printf ("returning %d\n", (unsigned char *) (INODE->i_block[logical_block]));
-+          printf ("returning %d\n", INODE->i_block[logical_block]);
-+#endif /* E2DEBUG */
-+          return INODE->i_block[logical_block];
-+        }
-+      /* else */
-+      logical_block -= EXT2_NDIR_BLOCKS;
-+      /* try the indirect block */
-+      if (logical_block < EXT2_ADDR_PER_BLOCK (SUPERBLOCK))
-+        {
-+          if (mapblock1 != 1
-+         && !ext2_rdfsb (INODE->i_block[EXT2_IND_BLOCK], DATABLOCK1))
-+       {
-+         errnum = ERR_FSYS_CORRUPT;
-+         return -1;
-+       }
-+          mapblock1 = 1;
-+          return ((__u32 *) DATABLOCK1)[logical_block];
-+        }
-+      /* else */
-+      logical_block -= EXT2_ADDR_PER_BLOCK (SUPERBLOCK);
-+      /* now try the double indirect block */
-+      if (logical_block < (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2)))
-+        {
-+          int bnum;
-+          if (mapblock1 != 2
-+         && !ext2_rdfsb (INODE->i_block[EXT2_DIND_BLOCK], DATABLOCK1))
-+       {
-+         errnum = ERR_FSYS_CORRUPT;
-+         return -1;
-+       }
-+          mapblock1 = 2;
-+          if ((bnum = (((__u32 *) DATABLOCK1)
-+                  [logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)]))
-+         != mapblock2
-+         && !ext2_rdfsb (bnum, DATABLOCK2))
-+       {
-+         errnum = ERR_FSYS_CORRUPT;
-+         return -1;
-+       }
-+          mapblock2 = bnum;
-+          return ((__u32 *) DATABLOCK2)
-+            [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
-+        }
-+      /* else */
-+      mapblock2 = -1;
-+      logical_block -= (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2));
-+      if (mapblock1 != 3
-+          && !ext2_rdfsb (INODE->i_block[EXT2_TIND_BLOCK], DATABLOCK1))
-+        {
-+          errnum = ERR_FSYS_CORRUPT;
-+          return -1;
-+        }
-+      mapblock1 = 3;
-+      if (!ext2_rdfsb (((__u32 *) DATABLOCK1)
-+                  [logical_block >> (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)
-+                                     * 2)],
-+                  DATABLOCK2))
-+        {
-+          errnum = ERR_FSYS_CORRUPT;
-+          return -1;
-+        }
-+      if (!ext2_rdfsb (((__u32 *) DATABLOCK2)
-+                  [(logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK))
-+                   & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)],
-+                  DATABLOCK2))
-+        {
-+          errnum = ERR_FSYS_CORRUPT;
-+          return -1;
-+        }
-       return ((__u32 *) DATABLOCK2)
--	[logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
--    }
--  /* else */
--  mapblock2 = -1;
--  logical_block -= (1 << (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK) * 2));
--  if (mapblock1 != 3
--      && !ext2_rdfsb (INODE->i_block[EXT2_TIND_BLOCK], DATABLOCK1))
--    {
--      errnum = ERR_FSYS_CORRUPT;
--      return -1;
-+       [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
-     }
--  mapblock1 = 3;
--  if (!ext2_rdfsb (((__u32 *) DATABLOCK1)
--		   [logical_block >> (EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK)
--				      * 2)],
--		   DATABLOCK2))
--    {
--      errnum = ERR_FSYS_CORRUPT;
--      return -1;
--    }
--  if (!ext2_rdfsb (((__u32 *) DATABLOCK2)
--		   [(logical_block >> EXT2_ADDR_PER_BLOCK_BITS (SUPERBLOCK))
--		    & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)],
--		   DATABLOCK2))
-+  /* inode is in extents format */
-+  else
-     {
-+      int i;
-+      struct ext4_extent_header *extent_hdr = ext4_recurse_extent_index((struct ext4_extent_header *) INODE->i_block, logical_block);
-+      struct ext4_extent *extent = (struct ext4_extent *) (extent_hdr + 1);
-+      if ( extent_hdr == NULL || extent_hdr->eh_magic != EXT4_EXT_MAGIC)
-+      {
-+        errnum = ERR_FSYS_CORRUPT;
-+        return -1;
-+      }
-+      for (i = 0; i<extent_hdr->eh_entries; i++)
-+        {
-+          if (extent[i].ee_block <= logical_block && logical_block < extent[i].ee_block + extent[i].ee_len && !(extent[i].ee_len>>15))
-+            return (logical_block - extent[i].ee_block + extent[i].ee_start);
-+        }
-+      /* We should not arrive here */
-       errnum = ERR_FSYS_CORRUPT;
-       return -1;
-     }
--  return ((__u32 *) DATABLOCK2)
--    [logical_block & (EXT2_ADDR_PER_BLOCK (SUPERBLOCK) - 1)];
- }
- 
- /* preconditions: all preconds of ext2fs_block_map */
diff --git a/abs/core/grub/grub-0.97-gpt.patch b/abs/core/grub/grub-0.97-gpt.patch
deleted file mode 100644
index 7b1a55c..0000000
--- a/abs/core/grub/grub-0.97-gpt.patch
+++ /dev/null
@@ -1,315 +0,0 @@
-diff -ruBbd --unidirectional-new-file grub-0.96/stage2/builtins.c grub-0.96-patched/stage2/builtins.c
---- grub-0.96/stage2/builtins.c	2004-06-20 09:33:04.000000000 -0400
-+++ grub-0.96-patched/stage2/builtins.c	2007-01-04 13:56:06.000000000 -0500
-@@ -1229,14 +1229,15 @@
-   for (drive = 0x80; drive < 0x88; drive++)
-     {
-       unsigned long part = 0xFFFFFF;
--      unsigned long start, len, offset, ext_offset;
--      int type, entry;
-+      unsigned long start, len, offset, ext_offset, gpt_offset;
-+      int type, entry, gpt_count, gpt_size;
-       char buf[SECTOR_SIZE];
- 
-       current_drive = drive;
-       while (next_partition (drive, 0xFFFFFF, &part, &type,
- 			     &start, &len, &offset, &entry,
--			     &ext_offset, buf))
-+                            &ext_offset, &gpt_offset,
-+                            &gpt_count, &gpt_size, buf))
- 	{
- 	  if (type != PC_SLICE_TYPE_NONE
- 	      && ! IS_PC_SLICE_TYPE_BSD (type)
-@@ -2806,8 +2807,8 @@
- {
-   int new_type;
-   unsigned long part = 0xFFFFFF;
--  unsigned long start, len, offset, ext_offset;
--  int entry, type;
-+  unsigned long start, len, offset, ext_offset, gpt_offset;
-+  int entry, type, gpt_count, gpt_size;
-   char mbr[512];
- 
-   /* Get the drive and the partition.  */
-@@ -2844,7 +2845,14 @@
-   /* Look for the partition.  */
-   while (next_partition (current_drive, 0xFFFFFF, &part, &type,
- 			 &start, &len, &offset, &entry,
--			 &ext_offset, mbr))
-+			 &ext_offset, &gpt_offset, &gpt_count, &gpt_size, mbr))
-+	  /* The partition may not be a GPT partition.  */
-+	  if (gpt_offset != 0)
-+	    {
-+		errnum = ERR_BAD_ARGUMENT;
-+		return 1;
-+	    }
-+
-     {
-       if (part == current_partition)
- 	{
-diff -ruBbd --unidirectional-new-file grub-0.96/stage2/disk_io.c grub-0.96-patched/stage2/disk_io.c
---- grub-0.96/stage2/disk_io.c	2004-05-23 12:35:24.000000000 -0400
-+++ grub-0.96-patched/stage2/disk_io.c	2007-01-04 14:01:08.000000000 -0500
-@@ -21,6 +21,7 @@
- 
- #include <shared.h>
- #include <filesys.h>
-+#include <gpt.h>
- 
- #ifdef SUPPORT_NETBOOT
- # define GRUB	1
-@@ -502,8 +503,8 @@
- set_partition_hidden_flag (int hidden)
- {
-   unsigned long part = 0xFFFFFF;
--  unsigned long start, len, offset, ext_offset;
--  int entry, type;
-+  unsigned long start, len, offset, ext_offset, gpt_offset;
-+  int entry, type, gpt_count, gpt_size;
-   char mbr[512];
-   
-   /* The drive must be a hard disk.  */
-@@ -524,7 +525,14 @@
-   /* Look for the partition.  */
-   while (next_partition (current_drive, 0xFFFFFF, &part, &type,           
- 			 &start, &len, &offset, &entry,
--			 &ext_offset, mbr))
-+			 &ext_offset, &gpt_offset, &gpt_count, &gpt_size, mbr))
-+	  /* The partition may not be a GPT partition.  */
-+	  if (gpt_offset != 0)
-+	    {
-+		errnum = ERR_BAD_ARGUMENT;
-+		return 1;
-+	    }
-+
-     {                                                                       
-       if (part == current_partition)
- 	{
-@@ -577,11 +585,14 @@
- 		unsigned long *partition, int *type,
- 		unsigned long *start, unsigned long *len,
- 		unsigned long *offset, int *entry,
--		unsigned long *ext_offset, char *buf)
-+               unsigned long *ext_offset,
-+               unsigned long *gpt_offset, int *gpt_count,
-+               int *gpt_size, char *buf)
- {
-   /* Forward declarations.  */
-   auto int next_bsd_partition (void);
-   auto int next_pc_slice (void);
-+  auto int next_gpt_slice(void);
- 
-   /* Get next BSD partition in current PC slice.  */
-   int next_bsd_partition (void)
-@@ -666,6 +677,40 @@
- 	  return 0;
- 	}
- 
-+      /* If this is a GPT partition table, read it as such.  */
-+      if (*entry == -1 && *offset == 0 && PC_SLICE_TYPE (buf, 0) == PC_SLICE_TYPE_GPT)
-+       {
-+         struct grub_gpt_header *hdr = (struct grub_gpt_header *) buf;
-+
-+         /* Read in the GPT Partition table header.  */
-+         if (! rawread (drive, 1, 0, SECTOR_SIZE, buf))
-+           return 0;
-+
-+         if (hdr->magic == GPT_HEADER_MAGIC && hdr->version == 0x10000)
-+           {
-+             /* Let gpt_offset point to the first entry in the GPT
-+                partition table.  This can also be used by callers of
-+                next_partition to determine if a entry comes from a
-+                GPT partition table or not.  */
-+             *gpt_offset = hdr->partitions;
-+             *gpt_count = hdr->maxpart;
-+             *gpt_size =  hdr->partentry_size;
-+             
-+             return next_gpt_slice();
-+           }
-+         else
-+           {
-+             /* This is not a valid header for a GPT partition table.
-+                Re-read the MBR or the boot sector of the extended
-+                partition.  */
-+             if (! rawread (drive, *offset, 0, SECTOR_SIZE, buf))
-+               return 0;
-+           }
-+       }
-+
-+      /* Not a GPT partition.  */
-+      *gpt_offset = 0;
-+
-       /* Increase the entry number.  */
-       (*entry)++;
- 
-@@ -710,6 +755,43 @@
-       return 1;
-     }
- 
-+  /* Get the next GPT slice.  */
-+  int next_gpt_slice (void)
-+    {
-+      struct grub_gpt_partentry *gptentry = (struct grub_gpt_partentry *) buf;
-+      /* Make GPT partitions show up as PC slices.  */
-+      int pc_slice_no = (*partition & 0xFF0000) >> 16;
-+
-+      /* If this is the first time...  */
-+      if (pc_slice_no == 0xFF)
-+       {
-+         pc_slice_no = -1;
-+         *entry = -1;
-+       }
-+
-+      do {
-+       (*entry)++;
-+
-+       if (*entry >= *gpt_count)
-+         {
-+           errnum = ERR_NO_PART;
-+           return 0;
-+         }
-+       /* Read in the GPT Partition table entry.  */
-+       if (! rawread (drive, (*gpt_offset) + GPT_ENTRY_SECTOR (*gpt_size, *entry), GPT_ENTRY_INDEX (*gpt_size, *entry), *gpt_size, buf))
-+         return 0;
-+      } while (! (gptentry->type1 && gptentry->type2));
-+
-+      pc_slice_no++;
-+      *start = gptentry->start;
-+      *len = gptentry->end - gptentry->start + 1;
-+      *type = PC_SLICE_TYPE_EXT2FS;
-+      *entry = pc_slice_no;
-+      *partition = (*entry << 16) | 0xFFFF;
-+
-+      return 1;
-+    }
-+
-   /* Start the body of this function.  */
-   
- #ifndef STAGE1_5
-@@ -717,6 +799,9 @@
-     return 0;
- #endif
- 
-+  if (*partition != 0xFFFFFF && *gpt_offset != 0)
-+    return next_gpt_slice ();
-+
-   /* If previous partition is a BSD partition or a PC slice which
-      contains BSD partitions...  */
-   if ((*partition != 0xFFFFFF && IS_PC_SLICE_TYPE_BSD (*type & 0xff))
-@@ -755,6 +840,9 @@
-   unsigned long dest_partition = current_partition;
-   unsigned long part_offset;
-   unsigned long ext_offset;
-+  unsigned long gpt_offset;
-+  int gpt_count;
-+  int gpt_size;
-   int entry;
-   char buf[SECTOR_SIZE];
-   int bsd_part, pc_slice;
-@@ -766,7 +854,8 @@
-       int ret = next_partition (current_drive, dest_partition,
- 				&current_partition, &current_slice,
- 				&part_start, &part_length,
--				&part_offset, &entry, &ext_offset, buf);
-+                               &part_offset, &entry, &ext_offset,
-+                               &gpt_offset, &gpt_count, &gpt_size, buf);
-       bsd_part = (current_partition >> 8) & 0xFF;
-       pc_slice = current_partition >> 16;
-       return ret;
-diff -ruBbd --unidirectional-new-file grub-0.96/stage2/gpt.h grub-0.96-patched/stage2/gpt.h
---- grub-0.96/stage2/gpt.h	1969-12-31 19:00:00.000000000 -0500
-+++ grub-0.96-patched/stage2/gpt.h	2007-01-04 13:52:14.000000000 -0500
-@@ -0,0 +1,68 @@
-+/*
-+ *  GRUB  --  GRand Unified Bootloader
-+ *  Copyright (C) 2002,2005,2006   Free Software Foundation, Inc.
-+ *
-+ *  This program 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 2 of the License, or
-+ *  (at your option) any later version.
-+ *
-+ *  This program 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 this program; if not, write to the Free Software
-+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-+ */
-+
-+#ifndef _GPT_H
-+#define _GPT_H
-+
-+typedef signed char grub_int8_t;
-+typedef signed short grub_int16_t;
-+typedef signed int grub_int32_t;
-+typedef signed long long int grub_int64_t;
-+typedef unsigned char grub_uint8_t;
-+typedef unsigned short grub_uint16_t;
-+typedef unsigned int grub_uint32_t;
-+typedef unsigned long long int grub_uint64_t;
-+
-+struct grub_gpt_header
-+{
-+  grub_uint64_t magic;
-+  grub_uint32_t version;
-+  grub_uint32_t headersize;
-+  grub_uint32_t crc32;
-+  grub_uint32_t unused1;
-+  grub_uint64_t primary;
-+  grub_uint64_t backup;
-+  grub_uint64_t start;
-+  grub_uint64_t end;
-+  grub_uint8_t guid[16];
-+  grub_uint64_t partitions;
-+  grub_uint32_t maxpart;
-+  grub_uint32_t partentry_size;
-+  grub_uint32_t partentry_crc32;
-+} __attribute__ ((packed));
-+
-+struct grub_gpt_partentry
-+{
-+  grub_uint64_t type1;
-+  grub_uint64_t type2;
-+  grub_uint8_t guid[16];
-+  grub_uint64_t start;
-+  grub_uint64_t end;
-+  grub_uint8_t attrib;
-+  char name[72];
-+} __attribute__ ((packed));
-+
-+#define GPT_HEADER_MAGIC       0x5452415020494645UL
-+
-+#define        GPT_ENTRY_SECTOR(size,entry)                                    \
-+       ((((entry) * (size) + 1) & ~(SECTOR_SIZE - 1)) >> SECTOR_BITS)
-+#define        GPT_ENTRY_INDEX(size,entry)                                     \
-+       ((((entry) * (size) + 1) & (SECTOR_SIZE - 1)) - 1)
-+
-+#endif /* _GPT_H */
-diff -ruBbd --unidirectional-new-file grub-0.96/stage2/pc_slice.h grub-0.96-patched/stage2/pc_slice.h
---- grub-0.96/stage2/pc_slice.h	2003-07-09 07:45:53.000000000 -0400
-+++ grub-0.96-patched/stage2/pc_slice.h	2007-01-04 13:52:14.000000000 -0500
-@@ -115,6 +115,7 @@
- #define PC_SLICE_TYPE_LINUX_EXTENDED	0x85
- #define PC_SLICE_TYPE_VSTAFS		0x9e
- #define PC_SLICE_TYPE_DELL_UTIL		0xde
-+#define PC_SLICE_TYPE_GPT              0xee
- #define PC_SLICE_TYPE_LINUX_RAID	0xfd
- 
- 
-diff -ruBbd --unidirectional-new-file grub-0.96/stage2/shared.h grub-0.96-patched/stage2/shared.h
---- grub-0.96/stage2/shared.h	2004-06-19 12:40:09.000000000 -0400
-+++ grub-0.96-patched/stage2/shared.h	2007-01-04 13:52:15.000000000 -0500
-@@ -934,7 +934,9 @@
- 		    unsigned long *partition, int *type,
- 		    unsigned long *start, unsigned long *len,
- 		    unsigned long *offset, int *entry,
--		    unsigned long *ext_offset, char *buf);
-+                   unsigned long *ext_offset,
-+                   unsigned long *gpt_offset, int *gpt_count,
-+                   int *gpt_size, char *buf);
- 
- /* Sets device to the one represented by the SAVED_* parameters. */
- int make_saved_active (void);
diff --git a/abs/core/grub/grub-inode-size.patch b/abs/core/grub/grub-inode-size.patch
deleted file mode 100644
index bef3bc1..0000000
--- a/abs/core/grub/grub-inode-size.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-diff -Nrup a/stage2/fsys_ext2fs.c b/stage2/fsys_ext2fs.c
---- a/stage2/fsys_ext2fs.c	2004-08-08 20:19:18.000000000 +0200
-+++ b/stage2/fsys_ext2fs.c	2008-01-30 14:27:20.000000000 +0100
-@@ -79,7 +79,52 @@ struct ext2_super_block
-     __u32 s_rev_level;		/* Revision level */
-     __u16 s_def_resuid;		/* Default uid for reserved blocks */
-     __u16 s_def_resgid;		/* Default gid for reserved blocks */
--    __u32 s_reserved[235];	/* Padding to the end of the block */
-+    /*
-+     * These fields are for EXT2_DYNAMIC_REV superblocks only.
-+     *
-+     * Note: the difference between the compatible feature set and
-+     * the incompatible feature set is that if there is a bit set
-+     * in the incompatible feature set that the kernel doesn't
-+     * know about, it should refuse to mount the filesystem.
-+     *
-+     * e2fsck's requirements are more strict; if it doesn't know
-+     * about a feature in either the compatible or incompatible
-+     * feature set, it must abort and not try to meddle with
-+     * things it doesn't understand...
-+     */
-+    __u32 s_first_ino;		/* First non-reserved inode */
-+    __u16 s_inode_size;		/* size of inode structure */
-+    __u16 s_block_group_nr;	/* block group # of this superblock */
-+    __u32 s_feature_compat;	/* compatible feature set */
-+    __u32 s_feature_incompat;	/* incompatible feature set */
-+    __u32 s_feature_ro_compat;	/* readonly-compatible feature set */
-+    __u8  s_uuid[16];		/* 128-bit uuid for volume */
-+    char  s_volume_name[16];	/* volume name */
-+    char  s_last_mounted[64];	/* directory where last mounted */
-+    __u32 s_algorithm_usage_bitmap; /* For compression */
-+    /*
-+     * Performance hints.  Directory preallocation should only
-+     * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
-+     */
-+    __u8  s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/
-+    __u8  s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */
-+    __u16 s_reserved_gdt_blocks;/* Per group table for online growth */
-+    /*
-+     * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set.
-+     */
-+    __u8 s_journal_uuid[16];	/* uuid of journal superblock */
-+    __u32 s_journal_inum;	/* inode number of journal file */
-+    __u32 s_journal_dev;	/* device number of journal file */
-+    __u32 s_last_orphan;	/* start of list of inodes to delete */
-+    __u32 s_hash_seed[4];	/* HTREE hash seed */
-+    __u8  s_def_hash_version;	/* Default hash version to use */
-+    __u8  s_jnl_backup_type; 	/* Default type of journal backup */
-+    __u16 s_reserved_word_pad;
-+    __u32 s_default_mount_opts;
-+    __u32 s_first_meta_bg;	/* First metablock group */
-+    __u32 s_mkfs_time;		/* When the filesystem was created */
-+    __u32 s_jnl_blocks[17]; 	/* Backup of the journal inode */
-+    __u32 s_reserved[172];	/* Padding to the end of the block */
-   };
- 
- struct ext2_group_desc
-@@ -218,6 +263,9 @@ struct ext2_dir_entry
- #define EXT2_ADDR_PER_BLOCK(s)          (EXT2_BLOCK_SIZE(s) / sizeof (__u32))
- #define EXT2_ADDR_PER_BLOCK_BITS(s)		(log2(EXT2_ADDR_PER_BLOCK(s)))
- 
-+#define EXT2_INODE_SIZE(s)		(SUPERBLOCK->s_inode_size)
-+#define EXT2_INODES_PER_BLOCK(s)	(EXT2_BLOCK_SIZE(s)/EXT2_INODE_SIZE(s))
-+
- /* linux/ext2_fs.h */
- #define EXT2_BLOCK_SIZE_BITS(s)        ((s)->s_log_block_size + 10)
- /* kind of from ext2/super.c */
-@@ -553,7 +601,7 @@ ext2fs_dir (char *dirname)
-       gdp = GROUP_DESC;
-       ino_blk = gdp[desc].bg_inode_table +
- 	(((current_ino - 1) % (SUPERBLOCK->s_inodes_per_group))
--	 >> log2 (EXT2_BLOCK_SIZE (SUPERBLOCK) / sizeof (struct ext2_inode)));
-+	 >> log2 (EXT2_INODES_PER_BLOCK (SUPERBLOCK)));
- #ifdef E2DEBUG
-       printf ("inode table fsblock=%d\n", ino_blk);
- #endif /* E2DEBUG */
-@@ -565,13 +613,12 @@ ext2fs_dir (char *dirname)
-       /* reset indirect blocks! */
-       mapblock2 = mapblock1 = -1;
- 
--      raw_inode = INODE +
--	((current_ino - 1)
--	 & (EXT2_BLOCK_SIZE (SUPERBLOCK) / sizeof (struct ext2_inode) - 1));
-+      raw_inode = (struct ext2_inode *)((char *)INODE +
-+	((current_ino - 1) & (EXT2_INODES_PER_BLOCK (SUPERBLOCK) - 1)) *
-+	EXT2_INODE_SIZE (SUPERBLOCK));
- #ifdef E2DEBUG
-       printf ("ipb=%d, sizeof(inode)=%d\n",
--	      (EXT2_BLOCK_SIZE (SUPERBLOCK) / sizeof (struct ext2_inode)),
--	      sizeof (struct ext2_inode));
-+	      EXT2_INODES_PER_BLOCK (SUPERBLOCK), EXT2_INODE_SIZE (SUPERBLOCK));
-       printf ("inode=%x, raw_inode=%x\n", INODE, raw_inode);
-       printf ("offset into inode table block=%d\n", (int) raw_inode - (int) INODE);
-       for (i = (unsigned char *) INODE; i <= (unsigned char *) raw_inode;
diff --git a/abs/core/grub/grub.cfg b/abs/core/grub/grub.cfg
new file mode 100644
index 0000000..1f08102
--- /dev/null
+++ b/abs/core/grub/grub.cfg
@@ -0,0 +1,139 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+insmod part_gpt
+insmod part_msdos
+if [ -s $prefix/grubenv ]; then
+  load_env
+fi
+set default="0"
+
+if [ x"${feature_menuentry_id}" = xy ]; then
+  menuentry_id_option="--id"
+else
+  menuentry_id_option=""
+fi
+
+export menuentry_id_option
+
+if [ "${prev_saved_entry}" ]; then
+  set saved_entry="${prev_saved_entry}"
+  save_env saved_entry
+  set prev_saved_entry=
+  save_env prev_saved_entry
+  set boot_once=true
+fi
+
+function savedefault {
+  if [ -z "${boot_once}" ]; then
+    saved_entry="${chosen}"
+    save_env saved_entry
+  fi
+}
+
+function load_video {
+  if [ x$feature_all_video_module = xy ]; then
+    insmod all_video
+  else
+    insmod efi_gop
+    insmod efi_uga
+    insmod ieee1275_fb
+    insmod vbe
+    insmod vga
+    insmod video_bochs
+    insmod video_cirrus
+  fi
+}
+
+if [ x$feature_default_font_path = xy ] ; then
+   font=unicode
+else
+insmod part_msdos
+insmod ext2
+set root='hd0,msdos5'
+if [ x$feature_platform_search_hint = xy ]; then
+  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5  ad4103fa-d940-47ca-8506-301d8071d467
+else
+  search --no-floppy --fs-uuid --set=root ad4103fa-d940-47ca-8506-301d8071d467
+fi
+    font="/usr/share/grub/unicode.pf2"
+fi
+
+if loadfont $font ; then
+  set gfxmode=auto
+  load_video
+  insmod gfxterm
+  set locale_dir=$prefix/locale
+  set lang=en_US
+  insmod gettext
+fi
+terminal_input console
+terminal_output gfxterm
+set timeout=5
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/10_linux ###
+menuentry 'Arch GNU/Linux, with Linux core repo kernel' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-core repo kernel-true-ad4103fa-d940-47ca-8506-301d8071d467' {
+	load_video
+	set gfxpayload=keep
+	insmod gzio
+	insmod part_msdos
+	insmod ext2
+	set root='hd0,msdos5'
+	if [ x$feature_platform_search_hint = xy ]; then
+	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5  ad4103fa-d940-47ca-8506-301d8071d467
+	else
+	  search --no-floppy --fs-uuid --set=root ad4103fa-d940-47ca-8506-301d8071d467
+	fi
+	echo	'Loading Linux core repo kernel ...'
+	linux	/boot/vmlinuz-linux root=UUID=ad4103fa-d940-47ca-8506-301d8071d467 ro  quiet
+	echo	'Loading initial ramdisk ...'
+	initrd	/boot/initramfs-linux.img
+}
+menuentry 'Arch GNU/Linux, with Linux core repo kernel (Fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-core repo kernel-fallback-ad4103fa-d940-47ca-8506-301d8071d467' {
+	load_video
+	set gfxpayload=keep
+	insmod gzio
+	insmod part_msdos
+	insmod ext2
+	set root='hd0,msdos5'
+	if [ x$feature_platform_search_hint = xy ]; then
+	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos5 --hint-efi=hd0,msdos5 --hint-baremetal=ahci0,msdos5  ad4103fa-d940-47ca-8506-301d8071d467
+	else
+	  search --no-floppy --fs-uuid --set=root ad4103fa-d940-47ca-8506-301d8071d467
+	fi
+	echo	'Loading Linux core repo kernel ...'
+	linux	/boot/vmlinuz-linux root=UUID=ad4103fa-d940-47ca-8506-301d8071d467 ro  quiet
+	echo	'Loading initial ramdisk ...'
+	initrd	/boot/initramfs-linux-fallback.img
+}
+
+### END /etc/grub.d/10_linux ###
+
+### BEGIN /etc/grub.d/20_linux_xen ###
+### END /etc/grub.d/20_linux_xen ###
+
+### BEGIN /etc/grub.d/20_memtest86+ ###
+### END /etc/grub.d/20_memtest86+ ###
+
+### BEGIN /etc/grub.d/30_os-prober ###
+### END /etc/grub.d/30_os-prober ###
+
+### BEGIN /etc/grub.d/40_custom ###
+# This file provides an easy way to add custom menu entries.  Simply type the
+# menu entries you want to add after this comment.  Be careful not to change
+# the 'exec tail' line above.
+### END /etc/grub.d/40_custom ###
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f  ${config_directory}/custom.cfg ]; then
+  source ${config_directory}/custom.cfg
+elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
+  source $prefix/custom.cfg;
+fi
+### END /etc/grub.d/41_custom ###
diff --git a/abs/core/grub/grub.default b/abs/core/grub/grub.default
new file mode 100644
index 0000000..fdd1fc3
--- /dev/null
+++ b/abs/core/grub/grub.default
@@ -0,0 +1,47 @@
+GRUB_DEFAULT=0
+GRUB_TIMEOUT=5
+GRUB_DISTRIBUTOR="Arch"
+GRUB_CMDLINE_LINUX_DEFAULT="quiet"
+GRUB_CMDLINE_LINUX=""
+
+# Preload both GPT and MBR modules so that they are not missed
+GRUB_PRELOAD_MODULES="part_gpt part_msdos"
+
+# Uncomment to enable Hidden Menu, and optionally hide the timeout count
+#GRUB_HIDDEN_TIMEOUT=5
+#GRUB_HIDDEN_TIMEOUT_QUIET=true
+
+# Uncomment to use basic console
+GRUB_TERMINAL_INPUT=console
+
+# Uncomment to disable graphical terminal
+#GRUB_TERMINAL_OUTPUT=console
+
+# The resolution used on graphical terminal
+# note that you can use only modes which your graphic card supports via VBE
+# you can see them in real GRUB with the command `vbeinfo'
+GRUB_GFXMODE=auto
+
+# Uncomment to allow the kernel use the same resolution used by grub
+GRUB_GFXPAYLOAD_LINUX=keep
+
+# Uncomment if you want GRUB to pass to the Linux kernel the old parameter 
+# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx" 
+#GRUB_DISABLE_LINUX_UUID=true
+
+# Uncomment to disable generation of recovery mode menu entries
+GRUB_DISABLE_RECOVERY=true
+
+# Uncomment and set to the desired menu colors.  Used by normal and wallpaper 
+# modes only.  Entries specified as foreground/background.
+#GRUB_COLOR_NORMAL="light-blue/black"
+#GRUB_COLOR_HIGHLIGHT="light-cyan/blue"
+
+# Uncomment one of them for the gfx desired, a image background or a gfxtheme
+#GRUB_BACKGROUND="/path/to/wallpaper"
+#GRUB_THEME="/path/to/gfxtheme"
+
+# Uncomment to get a beep at GRUB start
+#GRUB_INIT_TUNE="480 440 1"
+
+#GRUB_SAVEDEFAULT="true"
diff --git a/abs/core/grub/grub.install b/abs/core/grub/grub.install
index bf52382..9188b35 100644
--- a/abs/core/grub/grub.install
+++ b/abs/core/grub/grub.install
@@ -1,22 +1,33 @@
-info_dir=/usr/share/info
-info_files=(grub.info multiboot.info)
+infodir="usr/share/info"
+filelist=('grub.info' 'grub-dev.info')
 
 post_install() {
-  for f in ${info_files[@]}; do
-    install-info ${info_dir}/$f.gz ${info_dir}/dir 2> /dev/null
+  if [ -f /boot/grub/grub.cfg.pacsave ]; then
+    echo "Copying /boot/grub/grub.cfg.pacsave to /boot/grub/grub.cfg"
+    install -D -m0644 /boot/grub/grub.cfg.pacsave /boot/grub/grub.cfg
+  fi
+
+  cat << 'EOM'
+Generating grub.cfg.example config file...
+This may fail on some machines running a custom kernel.
+EOM
+  
+  grub-mkconfig -o /boot/grub/grub.cfg.example 2> /dev/null
+  echo "done."
+
+  for file in ${filelist[@]}; do
+    install-info ${infodir}/${file}.gz ${infodir}/dir 2> /dev/null
   done
 }
 
 post_upgrade() {
-        post_install
+  for file in ${filelist[@]}; do
+    install-info ${infodir}/${file}.gz ${infodir}/dir 2> /dev/null
+  done
 }
 
 pre_remove() {
-  for f in ${info_files[@]}; do
-    install-info --delete ${info_dir}/$f.gz ${info_dir}/dir 2> /dev/null
+  for file in ${filelist[@]}; do
+    install-info --delete ${infodir}/${file} ${infodir}/dir 2> /dev/null
   done
 }
-
-
-
-
diff --git a/abs/core/grub/grub_bzr_export.sh b/abs/core/grub/grub_bzr_export.sh
new file mode 100644
index 0000000..ff8f99e
--- /dev/null
+++ b/abs/core/grub/grub_bzr_export.sh
@@ -0,0 +1,113 @@
+#!/usr/bin/env bash
+
+## For actual repos
+
+# bzr branch bzr://bzr.savannah.gnu.org/grub-extras/lua lua
+# bzr branch bzr://bzr.savannah.gnu.org/grub-extras/gpxe gpxe
+# bzr branch bzr://bzr.savannah.gnu.org/grub-extras/ntldr-img ntldr-img
+# bzr branch bzr://bzr.savannah.gnu.org/grub-extras/915resolution 915resolution
+
+## For launchpad mirror
+
+# bzr branch lp:~the-ridikulus-rat/grub/grub-extras-lua lua
+# bzr branch lp:~the-ridikulus-rat/grub/grub-extras-gpxe gpxe
+# bzr branch lp:~the-ridikulus-rat/grub/grub-extras-ntldr-img ntldr-img
+# bzr branch lp:~the-ridikulus-rat/grub/grub-extras-915resolution 915resolution
+
+## grub-extras zfs is integrated into grub bzr main repo and is no longer needed separately.
+
+_WD="${PWD}/"
+_OUTPUT_DIR="${_WD}/"
+
+_ACTUAL_PKGVER="2.00"
+
+_GRUB_BZR_REPO_DIR="${_WD}/grub_mainline_BZR/"
+_GRUB_BZR_EXP_REPO_DIR="${_WD}/grub_experimental_BZR/"
+_GRUB_EXTRAS_REPOS_DIR="${_WD}/grub_extras_BZR/"
+
+_MAIN_SNAPSHOT() {
+	
+	cd "${_GRUB_BZR_REPO_DIR}/"
+	echo
+	
+	_REVNUM="$(bzr revno ${_GRUB_BZR_REPO_DIR})"
+	bzr export --root="grub-${_ACTUAL_PKGVER}" --format="tar" "${_OUTPUT_DIR}/grub_r${_REVNUM}.tar"
+	echo
+	
+	cd "${_OUTPUT_DIR}/"
+	
+	xz -9 "${_OUTPUT_DIR}/grub_r${_REVNUM}.tar"
+	echo
+	
+}
+
+_EXP_SNAPSHOT() {
+	
+	cd "${_GRUB_BZR_EXP_REPO_DIR}/"
+	echo
+	
+	_REVNUM="$(bzr revno ${_GRUB_BZR_EXP_REPO_DIR})"
+	bzr export --root="grub-${_ACTUAL_PKGVER}" --format="tar" "${_OUTPUT_DIR}/grub_exp_r${_REVNUM}.tar"
+	echo
+	
+	cd "${_OUTPUT_DIR}/"
+	
+	xz -9 "${_OUTPUT_DIR}/grub_exp_r${_REVNUM}.tar"
+	echo
+	
+}
+
+_EXTRAS_SNAPSHOT() {
+	
+	cd "${_GRUB_EXTRAS_REPOS_DIR}/${_GRUB_EXTRAS_NAME}/"
+	echo
+	
+	_REVNUM="$(bzr revno ${_GRUB_EXTRAS_REPOS_DIR}/${_GRUB_EXTRAS_NAME})"
+	bzr export --root="${_GRUB_EXTRAS_NAME}" --format="tar" "${_OUTPUT_DIR}/grub_extras_${_GRUB_EXTRAS_NAME}_r${_REVNUM}.tar"
+	echo
+	
+	cd "${_OUTPUT_DIR}/"
+	echo
+	
+	xz -9 "${_OUTPUT_DIR}/grub_extras_${_GRUB_EXTRAS_NAME}_r${_REVNUM}.tar"
+	echo
+	
+}
+
+echo
+
+set -x -e
+
+echo
+
+_MAIN_SNAPSHOT
+
+echo
+
+# _EXP_SNAPSHOT
+
+echo
+
+_GRUB_EXTRAS_NAME="lua"
+_EXTRAS_SNAPSHOT
+
+# _GRUB_EXTRAS_NAME="gpxe"
+# _EXTRAS_SNAPSHOT
+
+_GRUB_EXTRAS_NAME="ntldr-img"
+_EXTRAS_SNAPSHOT
+
+_GRUB_EXTRAS_NAME="915resolution"
+_EXTRAS_SNAPSHOT
+
+echo
+
+set +x +e
+
+echo
+
+unset _WD
+unset _OUTPUT_DIR
+unset _GRUB_BZR_REPO_DIR
+unset _GRUB_EXTRAS_REPOS_DIR
+unset _GRUB_EXTRAS_NAME
diff --git a/abs/core/grub/i2o.patch b/abs/core/grub/i2o.patch
deleted file mode 100644
index 2af846c..0000000
--- a/abs/core/grub/i2o.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-Only in grub-0.94/docs: grub.info
-Only in grub-0.94/docs: multiboot.info
-diff -ur grub-0.94/lib/device.c grub-0.94.new/lib/device.c
---- grub-0.94/lib/device.c	2004-05-07 04:50:36.375238696 +0200
-+++ grub-0.94.new/lib/device.c	2004-05-07 04:48:57.611253104 +0200
-@@ -419,6 +419,12 @@
- {
-   sprintf (name, "/dev/rd/c%dd%d", controller, drive);
- }
-+
-+static void
-+get_i2o_disk_name (char *name, int unit)
-+{
-+  sprintf (name, "/dev/i2o/hd%c", unit + 'a');
-+}
- #endif
- 
- /* Check if DEVICE can be read. If an error occurs, return zero,
-@@ -789,6 +795,26 @@
- 	  }
-       }
-   }
-+
-+  /* I2O disks.  */
-+  for (i = 0; i < 8; i++)
-+    {
-+      char name[16];
-+      
-+      get_i2o_disk_name (name, i);
-+      if (check_device (name))
-+	{
-+	  (*map)[num_hd + 0x80] = strdup (name);
-+	  assert ((*map)[num_hd + 0x80]);
-+	  
-+	  /* If the device map file is opened, write the map.  */
-+	  if (fp)
-+	    fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
-+	  
-+	  num_hd++;
-+	}
-+    }
-+  
- #endif /* __linux__ */
-   
-   /* OK, close the device map file if opened.  */
diff --git a/abs/core/grub/install-grub b/abs/core/grub/install-grub
deleted file mode 100644
index 0015a31..0000000
--- a/abs/core/grub/install-grub
+++ /dev/null
@@ -1,543 +0,0 @@
-#! /bin/sh
-
-# Install GRUB on your drive.
-#   Copyright (C) 1999,2000,2001,2002,2003,2004 Free Software Foundation, Inc.
-#
-# This file 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 2 of the License, or
-# (at your option) any later version.
-#
-# This program 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 this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-# Initialize some variables.
-prefix=/
-exec_prefix=${prefix}
-sbindir=${exec_prefix}/sbin
-libdir=${exec_prefix}/lib
-PACKAGE=grub
-VERSION=0.95
-host_cpu=i386
-host_os=linux-gnu
-host_vendor=pc
-pkglibdir=${libdir}/${PACKAGE}/${host_cpu}-${host_vendor}
-
-grub_shell=${sbindir}/grub
-log_file=/tmp/grub-install.log.$$
-img_file=/tmp/grub-install.img.$$
-rootdir=
-grub_prefix=/boot/grub
-
-install_device=
-no_floppy=
-force_lba=
-recheck=no
-sync_sleep=20
-debug=no
-
-# look for secure tempfile creation wrappers on this platform
-if test -x /bin/tempfile; then
-    mklog="/bin/tempfile --prefix=grub"
-    mkimg="/bin/tempfile --prefix=grub"
-elif test -x /bin/mktemp; then
-    mklog="/bin/mktemp /tmp/grub-install.log.XXXXXX"
-    mkimg="/bin/mktemp /tmp/grub-install.img.XXXXXX"
-else
-    mklog=""
-    mkimg=""
-fi
-
-# Usage: usage
-# Print the usage.
-usage () {
-    cat <<EOF
-Usage: grub-install [OPTION] install_device
-Install GRUB on your drive.
-
-  -h, --help              print this message and exit
-  -v, --version           print the version information and exit
-  --root-directory=DIR    install GRUB images under the directory DIR
-                          instead of the root directory
-  --grub-shell=FILE       use FILE as the grub shell
-  --no-floppy             do not probe any floppy drive
-  --force-lba             force GRUB to use LBA mode even for a buggy
-                          BIOS
-  --recheck               probe a device map even if it already exists
-  --sync-sleep            number of seconds to sleep while trying to
-                          sync XFS
-
-INSTALL_DEVICE can be a GRUB device name or a system device filename.
-
-grub-install copies GRUB images into the DIR/boot directory specfied by
---root-directory, and uses the grub shell to install grub into the boot
-sector.
-
-Report bugs to <bug-grub@gnu.org>.
-EOF
-}
-
-# Usage: getraid_mdadm mddevice
-# Routine to find a physical device from an md device
-# If found, the first grub BIOS device (from device.map) is returned 
-# If no BIOS drives match the RAID devices, the first device returned
-# from mdadm -D is returned
-getraid_mdadm() {
-	device=$1
-	mdadm=$(mdadm -D "$device") || {
-		echo "$PROG: mdadm -D $device failed" >&2
-		exit 1
-	}
-	eval "$(
-		echo "$mdadm" | awk '
-			$1 == "Number" && $2 == "Major" { start = 1; next }
-			$1 == "UUID" { print "uuid=" $3; start = 0; next }
-			!start { next }
-			$2 == 0 && $3 == 0 { next }
-			{ devices = devices "\n" $NF }
-			END { print "devices='\''" devices "'\''" }
-		'
-	)"
-
-	# Convert RAID devices list into a list of disks
-	tmp_disks=`echo "$devices" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
-					 -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
-					 -e 's%\(fd[0-9]*\)$%\1%' \
-					 -e 's%/part[0-9]*$%/disc%' \
-					 -e 's%\(c[0-7]d[0-9]*\).*$%\1%' \
-					 -e '/^$/d' |
-				     sed -n '1h;2,$H;${g;s/\n/|/g;p}'`
-
-	# Find first BIOS disk that's a member of the RAID array
-	# Default to first RAID member if no tmp_disks are BIOS devices
-	set -- `egrep $tmp_disks $device_map | \
-		sort | \
-		sed -n 1p `
-	device=${2:-${tmp_disks%%|*}}
-
-	# Return first partition on BIOS disk that's part of the RAID
-	echo "$devices" | \
-		sed -n "\:${device}:p" | \
-		sed -n 1p
-}
-
-# Usage: xfs_hack
-# Routine to flush xfs filesystem log (sync doesn't do this)
-# sleep is needed to give time for the log to be flushed
-xfs_hack () {
-    sync
-    if which xfs_freeze >/dev/null ; then
-        echo "Trying to sync filesystem, do not interrupt until complete."
-        xfs_freeze -f ${grubdir} 2>/dev/null
-	sleep $sync_sleep
-	xfs_freeze -u ${grubdir} 2>/dev/null
-        echo "Trying to sync filesystem is complete."
-    fi
-}
-
-# Usage: convert os_device
-# Convert an OS device to the corresponding GRUB drive.
-# This part is OS-specific.
-convert () {
-    # First, check if the device file exists.
-    if test -e "$1"; then
-	:
-    else
-	echo "$1: Not found or not a block device." 1>&2
-	exit 1
-    fi
-
-    # Break the device name into the disk part and the partition part.
-    case "$host_os" in
-    linux*)
-	# Find an actual physical device if we're passed a RAID device
-	case $1 in
-		/dev/md*)  set -- `getraid_mdadm $1`
-	esac
-	tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \
-				  -e 's%\(d[0-9]*\)p[0-9]*$%\1%' \
-				  -e 's%\(fd[0-9]*\)$%\1%' \
-				  -e 's%/part[0-9]*$%/disc%' \
-				  -e 's%\(c[0-7]d[0-9]*\).*$%\1%'`
-	tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \
-				  -e 's%.*d[0-9]*p*%%' \
-				  -e 's%.*/fd[0-9]*$%%' \
-				  -e 's%.*/floppy/[0-9]*$%%' \
-				  -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%' \
-				  -e 's%.*c[0-7]d[0-9]*p*%%'`
-	;;
-    gnu*)
-	tmp_disk=`echo "$1" | sed 's%\([sh]d[0-9]*\).*%\1%'`
-	tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;;
-    freebsd*)
-	tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([saw]d[0-9]*\).*$%r\1%' \
-			    | sed 's%r\{0,1\}\(da[0-9]*\).*$%r\1%'`
-	tmp_part=`echo "$1" \
-	    | sed "s%.*/r\{0,1\}[saw]d[0-9]\(s[0-9]*[a-h]\)%\1%" \
-       	    | sed "s%.*/r\{0,1\}da[0-9]\(s[0-9]*[a-h]\)%\1%"`
-	;;
-    netbsd*)
-	tmp_disk=`echo "$1" | sed 's%r\{0,1\}\([sw]d[0-9]*\).*$%r\1d%' \
-	    | sed 's%r\{0,1\}\(fd[0-9]*\).*$%r\1a%'`
-	tmp_part=`echo "$1" \
-	    | sed "s%.*/r\{0,1\}[sw]d[0-9]\([abe-p]\)%\1%"`
-	;;
-    *)
-	echo "grub-install does not support your OS yet." 1>&2
-	exit 1 ;;
-    esac
-
-    # Get the drive name.
-    tmp_drive=`grep -v '^#' $device_map | grep "$tmp_disk *$" \
-	| sed 's%.*\(([hf]d[0-9][a-g0-9,]*)\).*%\1%'`
-
-    # If not found, print an error message and exit.
-    if test "x$tmp_drive" = x; then
-	echo "$1 does not have any corresponding BIOS drive." 1>&2
-	exit 1
-    fi
-
-    if test "x$tmp_part" != x; then
-	# If a partition is specified, we need to translate it into the
-	# GRUB's syntax.
-	case "$host_os" in
-	linux*)
-	    echo "$tmp_drive" | sed "s%)$%,`expr $tmp_part - 1`)%" ;;
-	gnu*)
-	    if echo $tmp_part | grep "^s" >/dev/null; then
-		tmp_pc_slice=`echo $tmp_part \
-		    | sed "s%s\([0-9]*\)[a-g]*$%\1%"`
-		tmp_drive=`echo "$tmp_drive" \
-		    | sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
-	    fi
-	    if echo $tmp_part | grep "[a-g]$" >/dev/null; then
-		tmp_bsd_partition=`echo "$tmp_part" \
-		    | sed "s%[^a-g]*\([a-g]\)$%\1%"`
-		tmp_drive=`echo "$tmp_drive" \
-		    | sed "s%)%,$tmp_bsd_partition)%"`
-	    fi
-	    echo "$tmp_drive" ;;
-	freebsd*)
-	    if echo $tmp_part | grep "^s" >/dev/null; then
-		tmp_pc_slice=`echo $tmp_part \
-		    | sed "s%s\([0-9]*\)[a-h]*$%\1%"`
-		tmp_drive=`echo "$tmp_drive" \
-		    | sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"`
-	    fi
-	    if echo $tmp_part | grep "[a-h]$" >/dev/null; then
-		tmp_bsd_partition=`echo "$tmp_part" \
-		    | sed "s%s\{0,1\}[0-9]*\([a-h]\)$%\1%"`
-		tmp_drive=`echo "$tmp_drive" \
-		    | sed "s%)%,$tmp_bsd_partition)%"`
-	    fi
-	    echo "$tmp_drive" ;;
-	netbsd*)
-	    if echo $tmp_part | grep "^[abe-p]$" >/dev/null; then
-		tmp_bsd_partition=`echo "$tmp_part" \
-		    | sed "s%\([a-p]\)$%\1%"`
-		tmp_drive=`echo "$tmp_drive" \
-		    | sed "s%)%,$tmp_bsd_partition)%"`
-	    fi
-	    echo "$tmp_drive" ;;
-	esac
-    else
-	# If no partition is specified, just print the drive name.
-	echo "$tmp_drive"
-    fi
-}
-
-# Usage: resolve_symlink file
-# Find the real file/device that file points at
-resolve_symlink () {
-	tmp_fname=$1
-	# Resolve symlinks
-	while test -L $tmp_fname; do
-		tmp_new_fname=`ls -al $tmp_fname | sed -n 's%.*-> \(.*\)%\1%p'`
-		if test -z "$tmp_new_fname"; then
-			echo "Unrecognized ls output" 2>&1
-			exit 1
-		fi
-
-		# Convert relative symlinks
-		case $tmp_new_fname in
-			/*) tmp_fname="$tmp_new_fname"
-			;;
-			*) tmp_fname="`echo $tmp_fname | sed 's%/[^/]*$%%'`/$tmp_new_fname"
-			;;
-		esac
-	done
-	echo "$tmp_fname"
-}
-
-# Usage: find_device file
-# Find block device on which the file resides.
-find_device () {
-    # For now, this uses the program `df' to get the device name, but is
-    # this really portable?
-    tmp_fname=`df $1/ | sed -n 's%.*\(/dev/[^ 	]*\).*%\1%p'`
-
-    if test -z "$tmp_fname"; then
-	echo "Could not find device for $1" 2>&1
-	exit 1
-    fi
-
-	tmp_fname=`resolve_symlink $tmp_fname`
-
-    echo "$tmp_fname"
-}
-
-# Check the arguments.
-for option in "$@"; do
-    case "$option" in
-    -h | --help)
-	usage
-	exit 0 ;;
-    -v | --version)
-	echo "grub-install (GNU GRUB ${VERSION})"
-	exit 0 ;;
-    --root-directory=*)
-	rootdir=`echo "$option" | sed 's/--root-directory=//'` ;;
-    --grub-shell=*)
-	grub_shell=`echo "$option" | sed 's/--grub-shell=//'` ;;
-    --no-floppy)
-	no_floppy="--no-floppy" ;;
-    --force-lba)
-	force_lba="--force-lba" ;;
-    --recheck)
-	recheck=yes ;;
-    --sync-sleep=*)
-	sync_sleep=`echo "$option" | sed 's/--sync-sleep=//'` ;;
-    # This is an undocumented feature...
-    --debug)
-	debug=yes ;;
-    -*)
-	echo "Unrecognized option \`$option'" 1>&2
-	usage
-	exit 1
-	;;
-    *)
-	if test "x$install_device" != x; then
-	    echo "More than one install_devices?" 1>&2
-	    usage
-	    exit 1
-	fi
-	install_device="${option}" ;;
-    esac
-done
-
-if test "x$install_device" = x; then
-    echo "install_device not specified." 1>&2
-    usage
-    exit 1
-fi
-
-# If the debugging feature is enabled, print commands.
-if test $debug = yes; then
-    set -x
-fi
-
-# Initialize these directories here, since ROOTDIR was initialized.
-case "$host_os" in
-netbsd*)
-    # Because /boot is used for the boot block in NetBSD, use /grub
-    # instead of /boot/grub.
-    grub_prefix=/grub
-    bootdir=${rootdir}
-    ;;
-*)
-    # Use /boot/grub by default.
-    bootdir=${rootdir}/boot
-    ;;
-esac
-
-grubdir=${bootdir}/grub
-device_map=${grubdir}/device.map
-
-# Check if GRUB is installed.
-# This is necessary, because the user can specify "grub --read-only".
-set $grub_shell dummy
-if test -f "$1"; then
-    :
-else
-    echo "$1: Not found." 1>&2
-    exit 1
-fi
-
-if test -f "$pkglibdir/stage1"; then
-    :
-else
-    echo "${pkglibdir}/stage1: Not found." 1>&2
-    exit 1
-fi
-
-if test -f "$pkglibdir/stage2"; then
-    :
-else
-    echo "${pkglibdir}/stage2: Not found." 1>&2
-    exit 1
-fi
-
-# Don't check for *stage1_5, because it is not fatal even if any
-# Stage 1.5 does not exist.
-
-# Create the GRUB directory if it is not present.
-test -d "$bootdir" || mkdir "$bootdir" || exit 1
-test -d "$grubdir" || mkdir "$grubdir" || exit 1
-
-# If --recheck is specified, remove the device map, if present.
-if test $recheck = yes; then
-    rm -f $device_map
-fi
-
-# Create the device map file if it is not present.
-if test -f "$device_map"; then
-    :
-else
-    # Create a safe temporary file.
-    test -n "$mklog" && log_file=`$mklog`
-
-    xfs_hack
-    $grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
-quit
-EOF
-    if grep "Error [0-9]*: " $log_file >/dev/null; then
-	cat $log_file 1>&2
-	exit 1
-    fi
-
-    rm -f $log_file
-fi
-
-# Make sure that there is no duplicated entry.
-tmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' $device_map \
-    | sort | uniq -d | sed -n 1p`
-if test -n "$tmp"; then
-    echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2
-    exit 1
-fi
-
-# Check for INSTALL_DEVICE.
-case "$install_device" in
-/dev/*)
-    install_device=`resolve_symlink "$install_device"`
-    install_drive=`convert "$install_device"`
-    # I don't know why, but some shells wouldn't die if exit is
-    # called in a function.
-    if test "x$install_drive" = x; then
-	exit 1
-    fi ;;
-\([hf]d[0-9]*\))
-    install_drive="$install_device" ;;
-[hf]d[0-9]*)
-    # The GRUB format with no parenthesis.
-    install_drive="($install_device)" ;;
-*)
-    echo "Format of install_device not recognized." 1>&2
-    usage
-    exit 1 ;;
-esac
-
-# Get the root drive.
-root_device=`find_device ${rootdir}`
-bootdir_device=`find_device ${bootdir}`
-
-# Check if the boot directory is in the same device as the root directory.
-if test "x$root_device" != "x$bootdir_device"; then
-    # Perhaps the user has a separate boot partition.
-    root_device=$bootdir_device
-    grub_prefix="/grub"
-fi
-
-# Convert the root device to a GRUB drive.
-root_drive=`convert "$root_device"`
-if test "x$root_drive" = x; then
-    exit 1
-fi
-
-# Check if the root directory exists in the same device as the grub
-# directory.
-grubdir_device=`find_device ${grubdir}`
-
-if test "x$grubdir_device" != "x$root_device"; then
-    # For now, cannot deal with this situation.
-    cat <<EOF 1>&2
-You must set the root directory by the option --root-directory, because
-$grubdir does not exist in the root device $root_device.
-EOF
-    exit 1
-fi
-
-# Copy the GRUB images to the GRUB directory.
-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
-    rm -f $file || exit 1
-done
-for file in \
-    ${pkglibdir}/stage1 ${pkglibdir}/stage2 ${pkglibdir}/*stage1_5; do
-    cp -f $file ${grubdir} || exit 1
-done
-xfs_hack
-
-# Make sure that GRUB reads the same images as the host OS.
-test -n "$mkimg" && img_file=`$mkimg`
-test -n "$mklog" && log_file=`$mklog`
-
-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do
-    count=5
-    tmp=`echo $file | sed "s|^${grubdir}|${grub_prefix}|"`
-    while test $count -gt 0; do
-	$grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
-dump ${root_drive}${tmp} ${img_file}
-quit
-EOF
-	if grep "Error [0-9]*: " $log_file >/dev/null; then
-	    :
-	elif cmp $file $img_file >/dev/null; then
-	    break
-	fi
-	sleep 1
-	count=`expr $count - 1`    
-    done
-    if test $count -eq 0; then
-	echo "The file $file not read correctly." 1>&2
-	exit 1
-    fi
-done
-
-rm -f $img_file
-rm -f $log_file
-
-# Create a safe temporary file.
-test -n "$mklog" && log_file=`$mklog`
-
-# Now perform the installation.
-xfs_hack
-$grub_shell --batch $no_floppy --device-map=$device_map <<EOF >$log_file
-root $root_drive
-setup $force_lba --stage2=$grubdir/stage2 --prefix=$grub_prefix $install_drive
-quit
-EOF
-
-if grep "Error [0-9]*: " $log_file >/dev/null || test $debug = yes; then
-    cat $log_file 1>&2
-    exit 1
-fi
-
-rm -f $log_file
-
-# 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."
-echo "Check if this is correct or not. If any of the lines is incorrect,"
-echo "fix it and re-run the script \`grub-install'."
-echo
-
-cat $device_map
-
-# Bye.
-exit 0
diff --git a/abs/core/grub/install-grub.orig b/abs/core/grub/install-grub.orig
deleted file mode 100755
index 3eb7ce5..0000000
--- a/abs/core/grub/install-grub.orig
+++ /dev/null
@@ -1,187 +0,0 @@
-#!/bin/bash
-
-#
-# This is a little helper script that tries to convert linux-style device
-# names to grub-style.  It's not very smart, so it
-# probably won't work for more complicated setups.
-#
-# If it doesn't work for you, try installing grub manually:
-#
-#    # mkdir -p /boot/grub
-#    # cp /usr/lib/grub/i386-pc/* /boot/grub/
-#
-# Then start up the 'grub' shell and run something like the following:
-#
-#    grub> root(hd0,0)
-#    grub> setup(hd0)
-#
-# The "root" line should point to the partition your kernel is located on,
-# /boot if you have a separate boot partition, otherwise your root (/).
-#
-# The "setup" line tells grub which disc/partition to install the
-# bootloader to.  In the example above, it will install to the MBR of the
-# primary master hard drive.
-#
-
-usage() {
-	echo "usage: install-grub <install_device> [boot_device]"
-	echo
-	echo "where <install_device> is the device where Grub will be installed"
-	echo "and [boot_device] is the partition that contains the /boot"
-	echo "directory (auto-detected if omitted)"
-	echo
-	echo "examples: install-grub /dev/hda"
-	echo "          install-grub /dev/hda /dev/hda1"
-	echo
-	exit 0
-}
-
-## new install-grub, code was taken from setup script
-ROOTDEV=$1
-PART_ROOT=$2
-VMLINUZ=vmlinuz26
-
-if [ "$ROOTDEV" = "" ]; then
-	usage
-fi
-if [ "$PART_ROOT" = "" ]; then
-	PART_ROOT=$(mount | grep "on /boot type" | cut -d' ' -f 1)
-fi
-if [ "$PART_ROOT" = "" ]; then
-	PART_ROOT=$(mount | grep "on / type" | cut -d' ' -f 1)
-fi
-if [ "$PART_ROOT" = "" ]; then
-	echo "error: could not determine BOOT_DEVICE, please specify manually" >&2
-	exit 1
-fi
-
-
-get_grub_map() {
-	[ -e /tmp/dev.map ]  && rm /tmp/dev.map	
-	/sbin/grub --no-floppy --device-map /tmp/dev.map >/tmp/grub.log 2>&1 <<EOF
-quit
-EOF
-}
-
-mapdev() {
-	partition_flag=0
-	device_found=0
-	devs=$(cat /tmp/dev.map | grep -v fd | sed 's/ *\t/ /' | sed ':a;$!N;$!ba;s/\n/ /g')
-	linuxdevice=$(echo $1 | cut -b1-8)
-	if [ "$(echo $1 | egrep '[0-9]$')" ]; then
-		# /dev/hdXY
-		pnum=$(echo $1 | cut -b9-)
-		pnum=$(($pnum-1))
-		partition_flag=1
-	fi
-	for  dev in $devs
-	do
-	    if [ "(" = $(echo $dev | cut -b1) ]; then
-		grubdevice="$dev"
-	    else
-		if [ "$dev" = "$linuxdevice" ]; then
-			device_found=1
-			break   
-		fi
-	   fi
-	done	
-	if [ "$device_found" = "1" ]; then
-		if [ "$partition_flag" = "0" ]; then
-			echo "$grubdevice"
-		else
-			grubdevice_stringlen=${#grubdevice}
-			let grubdevice_stringlen--
-			grubdevice=$(echo $grubdevice | cut -b1-$grubdevice_stringlen)
-			echo "$grubdevice,$pnum)"
-		fi
-	else
-		echo " DEVICE NOT FOUND"
-	fi
-}
-
-dogrub() {
-	get_grub_map	
-	if [ ! -f /boot/grub/menu.lst ]; then
-		echo "Error: Couldn't find /boot/grub/menu.lst.  Is GRUB installed?"
-		exit 1
-	fi
-	# try to auto-configure GRUB...
-	if [ "$PART_ROOT" != "" -a "$S_GRUB" != "1" ]; then
-		grubdev=$(mapdev $PART_ROOT)
-		# look for a separately-mounted /boot partition
-		bootdev=$(mount | grep /boot | cut -d' ' -f 1)
-		if [ "$grubdev" != "" -o "$bootdev" != "" ]; then
-			cp /boot/grub/menu.lst /tmp/.menu.lst
-			# remove the default entries by truncating the file at our little tag (#-*)
-			head -n $(cat /tmp/.menu.lst | grep -n '#-\*' | cut -d: -f 1) /tmp/.menu.lst >/boot/grub/menu.lst
-			rm -f /tmp/.menu.lst
-			echo "" >>/boot/grub/menu.lst
-			echo "# (0) Arch Linux" >>/boot/grub/menu.lst
-			echo "title  Arch Linux" >>/boot/grub/menu.lst
-			subdir=
-			if [ "$bootdev" != "" ]; then
-				grubdev=$(mapdev $bootdev)
-			else
-				subdir="/boot"
-			fi
-			echo "root   $grubdev" >>/boot/grub/menu.lst
-			echo "kernel $subdir/$VMLINUZ root=$PART_ROOT ro" >>/boot/grub/menu.lst
-			if [ "$VMLINUZ" = "vmlinuz26" ]; then
-				echo "initrd $subdir/kernel26.img" >>/boot/grub/menu.lst
-			fi
-			echo "" >>/boot/grub/menu.lst
-			# adding fallback/full image
-			echo "# (1) Arch Linux" >>/boot/grub/menu.lst
-			echo "title  Arch Linux Fallback" >>/boot/grub/menu.lst
-			echo "root   $grubdev" >>/boot/grub/menu.lst
-			echo "kernel $subdir/$VMLINUZ root=$PART_ROOT ro" >>/boot/grub/menu.lst
-			if [ "$VMLINUZ" = "vmlinuz26" ]; then
-				echo "initrd $subdir/kernel26-fallback.img" >>/boot/grub/menu.lst
-			fi
-			echo "" >>/boot/grub/menu.lst
-		fi
-	fi
-
-	echo "Installing the GRUB bootloader..."
-	cp -a /usr/lib/grub/i386-pc/* /boot/grub/
-	sync
-	# freeze xfs filesystems to enable grub installation on xfs filesystems
-	if [ -x /usr/sbin/xfs_freeze ]; then
-		/usr/sbin/xfs_freeze -f /boot > /dev/null 2>&1
-		/usr/sbin/xfs_freeze -f / > /dev/null 2>&1
-	fi
-	# look for a separately-mounted /boot partition
-	bootpart=$(mount | grep /boot | cut -d' ' -f 1)
-	if [ "$bootpart" = "" ]; then
-			bootpart=$PART_ROOT
-	fi
-	bootpart=$(mapdev $bootpart)
-	bootdev=$(mapdev $ROOTDEV)
-	if [ "$bootpart" = "" ]; then
-		echo "Error: Missing/Invalid root device: $bootpart"
-		exit 1
-	fi
-	/sbin/grub --no-floppy --batch >/tmp/grub.log 2>&1 <<EOF
-root $bootpart
-setup $bootdev
-quit
-EOF
-cat /tmp/grub.log
-	# unfreeze xfs filesystems
-	if [ -x /usr/sbin/xfs_freeze ]; then
-		/usr/sbin/xfs_freeze -u /boot > /dev/null 2>&1
-		/usr/sbin/xfs_freeze -u / > /dev/null 2>&1
-	fi
-
-	if grep "Error [0-9]*: " /tmp/grub.log >/dev/null; then
-		echo "Error installing GRUB. (see /tmp/grub.log for output)"
-		exit 1
-	fi
-	echo "GRUB was successfully installed."
-
-rm -f /tmp/grub.log
-
-exit 0
-}
-
-dogrub
\ No newline at end of file
diff --git a/abs/core/grub/intelmac.patch b/abs/core/grub/intelmac.patch
deleted file mode 100644
index a3fabc7..0000000
--- a/abs/core/grub/intelmac.patch
+++ /dev/null
@@ -1,67 +0,0 @@
---- grub-0.97.orig/stage2/asm.S	2004-06-19 18:55:22.000000000 +0200
-+++ grub-0.97/stage2/asm.S	2006-04-21 11:10:52.000000000 +0200
-@@ -1651,7 +1651,29 @@
- 	jnz	3f
- 	ret
- 
--3:	/* use keyboard controller */
-+3:	/*
-+	 * try to switch gateA20 using PORT92, the "Fast A20 and Init"
-+	 * register
-+	*/
-+	mov $0x92, %dx
-+	inb %dx, %al
-+	/* skip the port92 code if it's unimplemented (read returns 0xff) */
-+	cmpb $0xff, %al
-+	jz 6f
-+	
-+	/* set or clear bit1, the ALT_A20_GATE bit */
-+	movb 4(%esp), %ah
-+	testb %ah, %ah
-+	jz 4f
-+	orb $2, %al
-+	jmp 5f
-+4:	and $0xfd, %al
-+	
-+	/* clear the INIT_NOW bit don't accidently reset the machine */
-+5:	and $0xfe, %al
-+	outb %al, %dx
-+	
-+6:	/* use keyboard controller */
- 	pushl	%eax
- 
- 	call    gloop1
-@@ -1661,9 +1683,12 @@
- 
- gloopint1:
- 	inb	$K_STATUS
-+	cmpb	$0xff, %al
-+	jz	gloopint1_done
- 	andb	$K_IBUF_FUL, %al
- 	jnz	gloopint1
- 
-+gloopint1_done:	
- 	movb	$KB_OUTPUT_MASK, %al
- 	cmpb	$0, 0x8(%esp)
- 	jz	gdoit
-@@ -1684,6 +1709,8 @@
- 
- gloop1:
- 	inb	$K_STATUS
-+	cmpb	$0xff, %al
-+	jz	gloop2ret
- 	andb	$K_IBUF_FUL, %al
- 	jnz	gloop1
- 
-@@ -1991,6 +2018,11 @@
- ENTRY(console_getkey)
- 	push	%ebp
- 
-+wait_for_key:
-+	call	EXT_C(console_checkkey)
-+	incl	%eax
-+	jz	wait_for_key
-+	
- 	call	EXT_C(prot_to_real)
- 	.code16
-  
diff --git a/abs/core/grub/menu.lst b/abs/core/grub/menu.lst
deleted file mode 100644
index 1c19f8a..0000000
--- a/abs/core/grub/menu.lst
+++ /dev/null
@@ -1,48 +0,0 @@
-# Config file for GRUB - The GNU GRand Unified Bootloader
-# /boot/grub/menu.lst
-
-# DEVICE NAME CONVERSIONS 
-#
-#  Linux           Grub
-# -------------------------
-#  /dev/fd0        (fd0)
-#  /dev/sda        (hd0)
-#  /dev/sdb2       (hd1,1)
-#  /dev/sda3       (hd0,2)
-#
-
-#  FRAMEBUFFER RESOLUTION SETTINGS
-#     +-------------------------------------------------+
-#          | 640x480    800x600    1024x768   1280x1024
-#      ----+--------------------------------------------
-#      256 | 0x301=769  0x303=771  0x305=773   0x307=775
-#      32K | 0x310=784  0x313=787  0x316=790   0x319=793
-#      64K | 0x311=785  0x314=788  0x317=791   0x31A=794
-#      16M | 0x312=786  0x315=789  0x318=792   0x31B=795
-#     +-------------------------------------------------+
-#  for more details and different resolutions see
-#  http://wiki.archlinux.org/index.php/GRUB#Framebuffer_Resolution 
-
-# general configuration:
-timeout   5
-default   0
-color light-blue/black light-cyan/blue
-
-# boot sections follow
-# each is implicitly numbered from 0 in the order of appearance below
-#
-# TIP: If you want a 1024x768 framebuffer, add "vga=773" to your kernel line.
-#
-#-*
-
-# (0) Arch Linux
-title  Arch Linux  [/boot/vmlinuz26]
-root   (hd0,0)
-kernel /vmlinuz26 root=/dev/sda3 ro
-initrd /kernel26.img
-
-# (1) Windows
-#title Windows
-#rootnoverify (hd0,0)
-#makeactive
-#chainloader +1
diff --git a/abs/core/grub/more-raid.patch b/abs/core/grub/more-raid.patch
deleted file mode 100644
index 39db234..0000000
--- a/abs/core/grub/more-raid.patch
+++ /dev/null
@@ -1,100 +0,0 @@
---- grub-0.95/lib/device.c.moreraid	2004-11-30 17:09:36.736099360 -0500
-+++ grub-0.95/lib/device.c	2004-11-30 17:12:17.319686944 -0500
-@@ -544,6 +544,17 @@
- }
- 
- static void
-+get_cciss_disk_name (char * name, int controller, int drive)
-+{
-+  sprintf (name, "/dev/cciss/c%dd%d", controller, drive);
-+}
-+
-+static void
-+get_cpqarray_disk_name (char * name, int controller, int drive)
-+{
-+  sprintf (name, "/dev/ida/c%dd%d", controller, drive);
-+}
-+static void
- get_ataraid_disk_name (char *name, int unit)
- {
-   sprintf (name, "/dev/ataraid/d%c", unit + '0');
-@@ -920,7 +931,7 @@
-     
-     for (controller = 0; controller < 8; controller++)
-       {
--	for (drive = 0; drive < 15; drive++)
-+	for (drive = 0; drive < 32; drive++)
- 	  {
- 	    char name[24];
- 	    
-@@ -940,6 +951,70 @@
-       }
-   }
- #endif /* __linux__ */
-+
-+#ifdef __linux__
-+  /* This is for cciss - we have
-+     /dev/cciss/c<controller>d<logical drive>p<partition>.
-+     
-+     cciss driver currently supports up to 8 controllers, 16 logical
-+     drives, and 7 partitions.  */
-+  {
-+    int controller, drive;
-+    
-+    for (controller = 0; controller < 8; controller++)
-+      {
-+	for (drive = 0; drive < 16; drive++)
-+	  {
-+	    char name[24];
-+	    
-+	    get_cciss_disk_name (name, controller, drive);
-+	    if (check_device (name))
-+	      {
-+		(*map)[num_hd + 0x80] = strdup (name);
-+		assert ((*map)[num_hd + 0x80]);
-+		
-+		/* If the device map file is opened, write the map.  */
-+		if (fp)
-+		  fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
-+		
-+		num_hd++;
-+	      }
-+	  }
-+      }
-+  }
-+#endif /* __linux__ */
-+
-+#ifdef __linux__
-+  /* This is for cpqarray - we have
-+     /dev/ida/c<controller>d<logical drive>p<partition>.
-+     
-+     cpqarray driver currently supports up to 8 controllers, 16 logical
-+     drives, and 15 partitions.  */
-+  {
-+    int controller, drive;
-+    
-+    for (controller = 0; controller < 8; controller++)
-+      {
-+	for (drive = 0; drive < 15; drive++)
-+	  {
-+	    char name[24];
-+	    
-+	    get_cpqarray_disk_name (name, controller, drive);
-+	    if (check_device (name))
-+	      {
-+		(*map)[num_hd + 0x80] = strdup (name);
-+		assert ((*map)[num_hd + 0x80]);
-+		
-+		/* If the device map file is opened, write the map.  */
-+		if (fp)
-+		  fprintf (fp, "(hd%d)\t%s\n", num_hd, name);
-+		
-+		num_hd++;
-+	      }
-+	  }
-+      }
-+  }
-+#endif /* __linux__ */
-   
-   /* OK, close the device map file if opened.  */
-   if (fp)
diff --git a/abs/core/grub/special-devices.patch b/abs/core/grub/special-devices.patch
deleted file mode 100644
index 894f3e8..0000000
--- a/abs/core/grub/special-devices.patch
+++ /dev/null
@@ -1,18 +0,0 @@
---- grub-0.93/lib/device.c.raid	2002-05-20 05:53:46.000000000 -0400
-+++ grub-0.93/lib/device.c	2002-12-28 23:24:10.000000000 -0500
-@@ -689,7 +689,14 @@
-       if (strcmp (dev + strlen(dev) - 5, "/disc") == 0)
- 	strcpy (dev + strlen(dev) - 5, "/part");
-     }
--  sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1);
-+
-+  sprintf (dev + strlen(dev), "%s%d", 
-+	   /* Compaq smart and others */
-+	   (strncmp(dev, "/dev/ida/", 9) == 0 ||
-+	    strncmp(dev, "/dev/ataraid/", 13) == 0 ||
-+	    strncmp(dev, "/dev/cciss/", 11) == 0 ||
-+	    strncmp(dev, "/dev/rd/", 8) == 0) ? "p" : "",
-+	   ((partition >> 16) & 0xFF) + 1);
-   
-   /* Open the partition.  */
-   fd = open (dev, O_RDWR);
-- 
cgit v0.12

