bug-grub
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: initrd breaks if VMALLOC_RESERVE is increased - Linux


From: Timothy Baldwin
Subject: Re: initrd breaks if VMALLOC_RESERVE is increased - Linux
Date: Sat, 10 Jan 2004 10:48:45 +0000
User-agent: KMail/1.5.94

On Thursday 08 January 2004 18:03, Glenn A Diehl wrote:

[Trying again - something broke my signature by refromating MIME headers]

> Anyway, this isn't a very good fix, but it does shed light on the
> problem.  Is there a correct way of making grub VMALLOC_RESERVE aware?

Use the value from the kernel header, as in this patch:


Index: stage2/boot.c
===================================================================
RCS file: /cvsroot/grub/grub/stage2/boot.c,v
retrieving revision 1.44
diff -u -r1.44 boot.c
--- stage2/boot.c       18 Mar 2003 21:07:35 -0000      1.44
+++ stage2/boot.c       9 Jan 2004 14:05:28 -0000
@@ -332,10 +332,8 @@
                switch (errnum)
                  {
                  case ERR_NUMBER_OVERFLOW:
-                   /* If an overflow occurs, use the maximum address for
-                      initrd instead. This is good, because MAXINT is
-                      greater than LINUX_INITRD_MAX_ADDRESS.  */
-                   linux_mem_size = LINUX_INITRD_MAX_ADDRESS;
+                   /* If an overflow occurs, use MAXINT instead */
+                   linux_mem_size = MAXINT;
                    errnum = ERR_NONE;
                    break;
                
@@ -357,7 +355,7 @@
                  
                      /* Check an overflow.  */
                      if (linux_mem_size > (MAXINT >> shift))
-                       linux_mem_size = LINUX_INITRD_MAX_ADDRESS;
+                       linux_mem_size = MAXINT;
                      else
                        linux_mem_size <<= shift;
                    }
@@ -785,7 +783,7 @@
 load_initrd (char *initrd)
 {
   int len;
-  unsigned long moveto;
+  unsigned long moveto, initrd_max_address;
   struct linux_kernel_header *lh
     = (struct linux_kernel_header *) (cur_addr - LINUX_SETUP_MOVE_SIZE);
   
@@ -802,6 +800,11 @@
       grub_close ();
       goto fail;
     }
+    
+  if (lh->version >= 0x203)
+    initrd_max_address = lh->initrd_max_address;
+  else
+    initrd_max_address = LINUX_INITRD_MAX_ADDRESS;
 
   if (linux_mem_size)
     moveto = linux_mem_size;
@@ -809,8 +812,8 @@
     moveto = (mbi.mem_upper + 0x400) << 10;
   
   moveto = (moveto - len) & 0xfffff000;
-  if (moveto + len >= LINUX_INITRD_MAX_ADDRESS)
-    moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000;
+  if (moveto + len >= initrd_max_address)
+    moveto = (initrd_max_address - len) & 0xfffff000;
   
   /* XXX: Linux 2.3.xx has a bug in the memory range check, so avoid
      the last page.
Index: stage2/shared.h
===================================================================
RCS file: /cvsroot/grub/grub/stage2/shared.h,v
retrieving revision 1.93
diff -u -r1.93 shared.h
--- stage2/shared.h     18 Mar 2003 23:51:59 -0000      1.93
+++ stage2/shared.h     9 Jan 2004 14:05:31 -0000
@@ -403,6 +403,7 @@
   unsigned short heap_end_ptr;         /* Free memory after setup end */
   unsigned short pad1;                 /* Unused */
   char *cmd_line_ptr;                  /* Points to the kernel command line */
+  unsigned long initrd_max_address;    /* Maximum initrd address */
 } __attribute__ ((packed));
 
 /* Memory map address range descriptor used by GET_MMAP_ENTRY. */

Attachment: pgp7xoKmOE1T0.pgp
Description: signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]