remove old grub1 files
This commit is contained in:
parent
0b6b9cb72c
commit
ce00477b29
@ -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)
|
@ -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;
|
||||
|
103
PKGBUILD
103
PKGBUILD
@ -1,103 +0,0 @@
|
||||
# Maintainer: Ronald van Haren <ronald.archlinux.org>
|
||||
|
||||
pkgname=grub
|
||||
pkgver=0.97
|
||||
pkgrel=21
|
||||
pkgdesc="A GNU multiboot boot loader"
|
||||
arch=('i686' 'x86_64')
|
||||
license=('GPL')
|
||||
url="http://www.gnu.org/software/grub/"
|
||||
groups=('base')
|
||||
depends=('ncurses' 'diffutils' 'sed')
|
||||
optdepends=('xfsprogs: freezing of xfs /boot in install-grub script')
|
||||
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
|
||||
grub-0.97-ldflags-objcopy-remove-build-id.patch)
|
||||
backup=('boot/grub/menu.lst')
|
||||
install=grub.install
|
||||
sha1sums=('2580626c4579bd99336d3af4482c346c95dac4fb'
|
||||
'33d43d48000b2027f9baec8fc99d33e0c4500c96'
|
||||
'60e8f7e4c113b85165fd5d9cd724e8413a337a12'
|
||||
'157b81dbad3576536b08642242accfa1aeb093a9'
|
||||
'adbb4685c98797ffb4dc83561ec75698991dddbd'
|
||||
'f2e0dff29a7c8a45e90aa07298a1b2a9a9d29afc'
|
||||
'c5e2c94ed0e759590b9eb38c9d979f075d19d7c0'
|
||||
'45fe668a3779664fb292591f426976b6c784d6c8'
|
||||
'066d7ab1ae442f88e94c9e4f1867ac6682965d06'
|
||||
'0436aa6fa0b6f768289172f983a3f4b69384629e'
|
||||
'a36f34e51efed540f1ddafd78e9c9f6d83e4c8d4'
|
||||
'61c4b58d2eaa3c1561d8e9d8fc41341ce8882869')
|
||||
|
||||
#set destination architecture here
|
||||
#DESTARCH="i686"
|
||||
DESTARCH="x86_64"
|
||||
|
||||
|
||||
build() {
|
||||
cd $srcdir/$pkgname-$pkgver
|
||||
|
||||
# optimizations break the build -- disable them
|
||||
# adding special devices to grub, patches are from fedora
|
||||
patch -Np1 -i ../special-devices.patch
|
||||
patch -Np1 -i ../i2o.patch
|
||||
patch -Np1 -i ../more-raid.patch
|
||||
patch -Np1 -i ../intelmac.patch
|
||||
# Add support for bigger inode size to e2fs_stage1_5
|
||||
patch -Np1 -i ../grub-inode-size.patch
|
||||
# Add ext4 support
|
||||
# http://www.mail-archive.com/bug-grub@gnu.org/msg11458.html
|
||||
patch -Np1 -i ../ext4.patch
|
||||
# binutils fix
|
||||
patch -Np1 -i ../grub-0.97-ldflags-objcopy-remove-build-id.patch
|
||||
|
||||
sed -e'/^AC_PROG_CC/ a\AM_PROG_CC_C_O\ ' -i "${srcdir}/${pkgname}-${pkgver}/configure.ac"
|
||||
sed -e'/^AC_PROG_CC/ a\AM_PROG_AS\ ' -i "${srcdir}/${pkgname}-${pkgver}/configure.ac"
|
||||
|
||||
## recreate ./configure script with the required changes in LDFLAGS and objcopy
|
||||
aclocal
|
||||
autoconf
|
||||
autoreconf
|
||||
automake
|
||||
|
||||
#arch64 fixes for static build
|
||||
if [ "$CARCH" = "x86_64" ]; then ## correcting problems for new wersion of autotools
|
||||
|
||||
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
|
||||
# patch from frugalware to make it boot when more than 2GB ram installed
|
||||
patch -Np1 -i ../05-grub-0.97-initrdaddr.diff
|
||||
CFLAGS="-static -fno-strict-aliasing" ./configure --prefix=/usr --bindir=/bin --sbindir=/sbin \
|
||||
--mandir=/usr/share/man --infodir=/usr/share/info
|
||||
else
|
||||
CFLAGS="-fno-strict-aliasing" ./configure --prefix=/usr --bindir=/bin --sbindir=/sbin \
|
||||
--mandir=/usr/share/man --infodir=/usr/share/info
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
package() {
|
||||
cd $srcdir/$pkgname-$pkgver
|
||||
|
||||
CFLAGS= make
|
||||
make DESTDIR=$pkgdir install
|
||||
install -D -m644 ../menu.lst $pkgdir/boot/grub/menu.lst
|
||||
install -D -m755 ../install-grub $pkgdir/sbin/install-grub
|
||||
|
||||
if [ "$DESTARCH" = "x86_64" ]; then
|
||||
# fool makepkg into building a x86_64 package
|
||||
export CARCH="x86_64"
|
||||
fi
|
||||
}
|
263
ext4.patch
263
ext4.patch
@ -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 */
|
@ -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,
|
||||
¤t_partition, ¤t_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);
|
@ -1,196 +0,0 @@
|
||||
diff --git a/Makefile.in b/Makefile.in
|
||||
index 6652366..ba058eb 100644
|
||||
--- a/Makefile.in
|
||||
+++ b/Makefile.in
|
||||
@@ -112,6 +112,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
diff --git a/acinclude.m4 b/acinclude.m4
|
||||
index 368839c..32b3fa6 100644
|
||||
--- a/acinclude.m4
|
||||
+++ b/acinclude.m4
|
||||
@@ -57,7 +57,7 @@ else
|
||||
fi
|
||||
grub_cv_prog_objcopy_absolute=yes
|
||||
for link_addr in 2000 8000 7C00; do
|
||||
- if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then :
|
||||
+ if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr -Wl,--build-id=none conftest.o -o conftest.exec]); then :
|
||||
else
|
||||
AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
|
||||
fi
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index bb9e1d9..9ac5c9f 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -115,6 +115,9 @@ if test "x$ac_cv_prog_gcc" = xyes; then
|
||||
fi
|
||||
fi
|
||||
|
||||
+LOADER_LDFLAGS="-Wl,--build-id=none"
|
||||
+AC_SUBST(LOADER_LDFLAGS)
|
||||
+
|
||||
AC_SUBST(STAGE1_CFLAGS)
|
||||
AC_SUBST(STAGE2_CFLAGS)
|
||||
AC_SUBST(GRUB_CFLAGS)
|
||||
diff --git a/docs/Makefile.in b/docs/Makefile.in
|
||||
index 3e2de4b..7b2c94d 100644
|
||||
--- a/docs/Makefile.in
|
||||
+++ b/docs/Makefile.in
|
||||
@@ -131,6 +131,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
diff --git a/grub/Makefile.in b/grub/Makefile.in
|
||||
index 136c38f..7c23ebe 100644
|
||||
--- a/grub/Makefile.in
|
||||
+++ b/grub/Makefile.in
|
||||
@@ -108,6 +108,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
diff --git a/lib/Makefile.in b/lib/Makefile.in
|
||||
index 3dae206..449e126 100644
|
||||
--- a/lib/Makefile.in
|
||||
+++ b/lib/Makefile.in
|
||||
@@ -107,6 +107,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
diff --git a/netboot/Makefile.in b/netboot/Makefile.in
|
||||
index 75ac299..0275768 100644
|
||||
--- a/netboot/Makefile.in
|
||||
+++ b/netboot/Makefile.in
|
||||
@@ -108,6 +108,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
diff --git a/stage1/Makefile.am b/stage1/Makefile.am
|
||||
index 0afc285..3d83356 100644
|
||||
--- a/stage1/Makefile.am
|
||||
+++ b/stage1/Makefile.am
|
||||
@@ -5,7 +5,7 @@ CLEANFILES = $(nodist_pkglib_DATA)
|
||||
|
||||
# We can't use builtins or standard includes.
|
||||
AM_CCASFLAGS = $(STAGE1_CFLAGS) -fno-builtin -nostdinc
|
||||
-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
|
||||
+LDFLAGS = $(LOADER_LDFLAGS) -nostdlib -Wl,-N,-Ttext,7C00
|
||||
|
||||
noinst_PROGRAMS = stage1.exec
|
||||
stage1_exec_SOURCES = stage1.S stage1.h
|
||||
diff --git a/stage1/Makefile.in b/stage1/Makefile.in
|
||||
index 7134bdf..ee4477f 100644
|
||||
--- a/stage1/Makefile.in
|
||||
+++ b/stage1/Makefile.in
|
||||
@@ -110,9 +110,10 @@ INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
-LDFLAGS = -nostdlib -Wl,-N,-Ttext,7C00
|
||||
+LDFLAGS = $(LOADER_LDFLAGS) -nostdlib -Wl,-N,-Ttext,7C00
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
diff --git a/stage2/Makefile.am b/stage2/Makefile.am
|
||||
index f8e6d42..ff6f347 100644
|
||||
--- a/stage2/Makefile.am
|
||||
+++ b/stage2/Makefile.am
|
||||
@@ -55,11 +55,11 @@ noinst_PROGRAMS = pre_stage2.exec start.exec start_eltorito.exec \
|
||||
endif
|
||||
MOSTLYCLEANFILES = $(noinst_PROGRAMS)
|
||||
|
||||
-PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
|
||||
-START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
|
||||
-NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
|
||||
-PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||
-START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||
+PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200 $(LOADER_LDFLAGS)
|
||||
+START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 $(LOADER_LDFLAGS)
|
||||
+NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0 $(LOADER_LDFLAGS)
|
||||
+PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 $(LOADER_LDFLAGS)
|
||||
+START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 $(LOADER_LDFLAGS)
|
||||
|
||||
if NETBOOT_SUPPORT
|
||||
NETBOOT_FLAGS = -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1
|
||||
@@ -82,7 +82,7 @@ endif
|
||||
STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
|
||||
$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS)
|
||||
|
||||
-STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
|
||||
+STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 $(LOADER_LDFLAGS)
|
||||
STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
|
||||
|
||||
# For stage2 target.
|
||||
diff --git a/stage2/Makefile.in b/stage2/Makefile.in
|
||||
index d0062bd..88b2038 100644
|
||||
--- a/stage2/Makefile.in
|
||||
+++ b/stage2/Makefile.in
|
||||
@@ -355,6 +355,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
||||
@@ -468,11 +469,11 @@ libgrub_a_CFLAGS = $(GRUB_CFLAGS) -I$(top_srcdir)/lib \
|
||||
@DISKLESS_SUPPORT_FALSE@noinst_DATA = pre_stage2 start start_eltorito
|
||||
@DISKLESS_SUPPORT_TRUE@noinst_DATA = pre_stage2 start start_eltorito nbloader pxeloader diskless
|
||||
MOSTLYCLEANFILES = $(noinst_PROGRAMS)
|
||||
-PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200
|
||||
-START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000
|
||||
-NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0
|
||||
-PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||
-START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||
+PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200 $(LOADER_LDFLAGS)
|
||||
+START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 $(LOADER_LDFLAGS)
|
||||
+NBLOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,0 $(LOADER_LDFLAGS)
|
||||
+PXELOADER_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 $(LOADER_LDFLAGS)
|
||||
+START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00 $(LOADER_LDFLAGS)
|
||||
@NETBOOT_SUPPORT_FALSE@NETBOOT_FLAGS =
|
||||
@NETBOOT_SUPPORT_TRUE@NETBOOT_FLAGS = -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1
|
||||
@SERIAL_SUPPORT_FALSE@SERIAL_FLAGS =
|
||||
@@ -482,7 +483,7 @@ START_ELTORITO_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,7C00
|
||||
STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \
|
||||
$(NETBOOT_FLAGS) $(SERIAL_FLAGS) $(HERCULES_FLAGS)
|
||||
|
||||
-STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000
|
||||
+STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 $(LOADER_LDFLAGS)
|
||||
STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1
|
||||
|
||||
# For stage2 target.
|
||||
diff --git a/util/Makefile.in b/util/Makefile.in
|
||||
index e700cf7..cd3bf51 100644
|
||||
--- a/util/Makefile.in
|
||||
+++ b/util/Makefile.in
|
||||
@@ -113,6 +113,7 @@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
LDFLAGS = @LDFLAGS@
|
||||
LIBOBJS = @LIBOBJS@
|
||||
LIBS = @LIBS@
|
||||
+LOADER_LDFLAGS = @LOADER_LDFLAGS@
|
||||
LTLIBOBJS = @LTLIBOBJS@
|
||||
MAINT = @MAINT@
|
||||
MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@
|
@ -1,100 +0,0 @@
|
||||
diff -Naur grub-0.97-800/stage2/fsys_ext2fs.c grub-0.97-810/stage2/fsys_ext2fs.c
|
||||
--- grub-0.97-800/stage2/fsys_ext2fs.c 2008-07-21 00:40:21.668879475 -0600
|
||||
+++ grub-0.97-810/stage2/fsys_ext2fs.c 2008-07-21 01:01:11.063953773 -0600
|
||||
@@ -79,7 +79,52 @@
|
||||
__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,14 @@
|
||||
#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_GOOD_OLD_REV 0 /* The good old (original) format */
|
||||
+#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
|
||||
+#define EXT2_GOOD_OLD_INODE_SIZE 128
|
||||
+#define EXT2_INODE_SIZE(s) (((s)->s_rev_level == EXT2_GOOD_OLD_REV) ? \
|
||||
+ EXT2_GOOD_OLD_INODE_SIZE : \
|
||||
+ (s)->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 +606,7 @@
|
||||
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 +618,12 @@
|
||||
/* 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;
|
||||
|
20
grub.install
20
grub.install
@ -1,20 +0,0 @@
|
||||
infodir=/usr/share/info
|
||||
filelist=(grub.info multiboot.info)
|
||||
|
||||
post_install() {
|
||||
[ -x usr/bin/install-info ] || return 0
|
||||
for file in ${filelist[@]}; do
|
||||
install-info $infodir/$file.gz $infodir/dir 2> /dev/null
|
||||
done
|
||||
}
|
||||
|
||||
post_upgrade() {
|
||||
post_install $1
|
||||
}
|
||||
|
||||
pre_remove() {
|
||||
[ -x usr/bin/install-info ] || return 0
|
||||
for file in ${filelist[@]}; do
|
||||
install-info --delete $infodir/$file.gz $infodir/dir 2> /dev/null
|
||||
done
|
||||
}
|
45
i2o.patch
45
i2o.patch
@ -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. */
|
204
install-grub
204
install-grub
@ -1,204 +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}
|
||||
|
||||
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
|
||||
|
||||
for kernel in /boot/vmlinuz-linux* /boot/vmlinuz26-*; do
|
||||
if [ ${kernel} == "/boot/vmlinuz-linux*" ] || [ ${kernel} == "/boot/vmlinuz26-*" ] ; then
|
||||
echo > /dev/null
|
||||
else
|
||||
VMLINUZ=$( echo ${kernel} | cut -c 7- )
|
||||
|
||||
if [ "$( echo ${VMLINUZ} | cut -c -13 )" = "vmlinuz-linux" ]; then # new naming scheme for linux > 3.0
|
||||
extension=$( echo ${VMLINUZ} | cut -c 14- )
|
||||
INITRAMFS_BASENAME=initramfs-linux${extension}
|
||||
else # old naming scheme for lts kernel
|
||||
extension=$( echo ${VMLINUZ} | cut -c 10- )
|
||||
INITRAMFS_BASENAME=kernel26${extension}
|
||||
fi
|
||||
|
||||
echo "" >>/boot/grub/menu.lst
|
||||
echo "# (0) Arch Linux" >>/boot/grub/menu.lst
|
||||
echo "title Arch Linux - ${VMLINUZ}" >>/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
|
||||
echo "initrd ${subdir}/${INITRAMFS_BASENAME}.img" >>/boot/grub/menu.lst
|
||||
echo "" >>/boot/grub/menu.lst
|
||||
|
||||
# adding fallback/full image
|
||||
echo "# (1) Arch Linux" >>/boot/grub/menu.lst
|
||||
echo "title Arch Linux Fallback - ${VMLINUZ}" >>/boot/grub/menu.lst
|
||||
echo "root ${grubdev}" >>/boot/grub/menu.lst
|
||||
echo "kernel ${subdir}/${VMLINUZ} root=${PART_ROOT} ro" >>/boot/grub/menu.lst
|
||||
echo "initrd ${subdir}/${INITRAMFS_BASENAME}-fallback.img" >>/boot/grub/menu.lst
|
||||
echo "" >>/boot/grub/menu.lst
|
||||
fi
|
||||
done
|
||||
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
|
||||
[ "$(stat -fLc %T /boot)" == "xfs" ] && /usr/sbin/xfs_freeze -f /boot > /dev/null 2>&1
|
||||
[ "$(stat -fLc %T /)" == "xfs" ] && /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
|
||||
|
||||
echo ${bootpart}
|
||||
echo ${bootdev}
|
||||
/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
|
||||
[ "$(stat -fLc %T /boot)" == "xfs" ] && /usr/sbin/xfs_freeze -u /boot > /dev/null 2>&1
|
||||
[ "$(stat -fLc %T /)" == "xfs" ] && /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
|
@ -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
|
||||
|
48
menu.lst
48
menu.lst
@ -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
|
||||
# https://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/vmlinuz-linux]
|
||||
root (hd0,0)
|
||||
kernel /vmlinuz-linux root=/dev/sda3 ro
|
||||
initrd /initramfs-linux.img
|
||||
|
||||
# (1) Windows
|
||||
#title Windows
|
||||
#rootnoverify (hd0,0)
|
||||
#makeactive
|
||||
#chainloader +1
|
100
more-raid.patch
100
more-raid.patch
@ -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)
|
@ -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);
|
Loading…
Reference in New Issue
Block a user