--- grub-0.93/stage2/boot.c.orig 2002-11-30 12:29:16.000000000 -0500 +++ grub-0.93/stage2/boot.c 2006-12-05 18:01:50.000000000 -0500 @@ -785,7 +785,7 @@ load_initrd (char *initrd) { int len; - unsigned long moveto; + unsigned long rdimg; struct linux_kernel_header *lh = (struct linux_kernel_header *) (cur_addr - LINUX_SETUP_MOVE_SIZE); @@ -796,33 +796,39 @@ if (! grub_open (initrd)) goto fail; - len = grub_read ((char *) cur_addr, -1); - if (! len) + len = grub_filelen(); + if(!len) { - grub_close (); + grub_close(); goto fail; } - + if (linux_mem_size) - moveto = linux_mem_size; + rdimg = linux_mem_size; else - moveto = (mbi.mem_upper + 0x400) << 10; + rdimg = (mbi.mem_upper + 0x400) << 10; - moveto = (moveto - len) & 0xfffff000; - if (moveto + len >= LINUX_INITRD_MAX_ADDRESS) - moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000; + rdimg = (rdimg - len) & 0xfffff000; + if (rdimg + len >= LINUX_INITRD_MAX_ADDRESS) + rdimg = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000; /* XXX: Linux 2.3.xx has a bug in the memory range check, so avoid the last page. XXX: Linux 2.2.xx has a bug in the memory range check, which is worse than that of Linux 2.3.xx, so avoid the last 64kb. *sigh* */ - moveto -= 0x10000; - memmove ((void *) RAW_ADDR (moveto), (void *) cur_addr, len); + rdimg -= 0x10000; + + len = grub_read ((char *) RAW_ADDR(rdimg), -1); + if (! len) + { + grub_close (); + goto fail; + } - printf (" [Linux-initrd @ 0x%x, 0x%x bytes]\n", moveto, len); + printf (" [Linux-initrd @ 0x%x, 0x%x bytes]\n", rdimg, len); /* FIXME: Should check if the kernel supports INITRD. */ - lh->ramdisk_image = RAW_ADDR (moveto); + lh->ramdisk_image = RAW_ADDR (rdimg); lh->ramdisk_size = len; grub_close (); --- grub-0.93/stage2/disk_io.c.orig 2002-12-04 17:54:14.000000000 -0500 +++ grub-0.93/stage2/disk_io.c 2006-12-05 18:01:50.000000000 -0500 @@ -1685,6 +1685,12 @@ } int +grub_filelen() +{ + return filemax; +} + +int dir (char *dirname) { #ifndef NO_DECOMPRESSION --- grub-0.93/stage2/shared.h.orig 2002-12-02 18:15:12.000000000 -0500 +++ grub-0.93/stage2/shared.h 2006-12-05 18:01:50.000000000 -0500 @@ -936,6 +936,9 @@ /* Reposition a file offset. */ int grub_seek (int offset); +/* Get the length of a file opened with grub_open. */ +int grub_filelen(); + /* Close a file. */ void grub_close (void);