grub-devel
[Top][All Lists]
Advanced

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

Re: macbook EFI experiences


From: Bean
Subject: Re: macbook EFI experiences
Date: Wed, 4 Jun 2008 19:08:33 +0800

On Wed, Jun 4, 2008 at 7:01 PM, Isaac Dupree
<address@hidden> wrote:
> how do you apply this patch?  With `patch -p1` I'm getting:
> 2 out of 4 hunks FAILED -- saving rejects to file
> loader/i386/efi/linux.c.rej
>
> any more infos needed?

There maybe some code mixups, try this one:

BTW, are you using a customized kernel ? Some people reports that efi
booting don't work. They have 32-bit firmware just like yours, but
hangs even without the initrd.


diff --git a/loader/i386/efi/linux.c b/loader/i386/efi/linux.c
index ee3fb99..5ace7c0 100644
--- a/loader/i386/efi/linux.c
+++ b/loader/i386/efi/linux.c
@@ -601,7 +601,7 @@ grub_rescue_cmd_initrd (int argc, char *argv[])

   lh = (struct linux_kernel_header *) real_mode_mem;

-  addr_max = grub_cpu_to_le32 (lh->initrd_addr_max);
+  addr_max = (grub_cpu_to_le32 (lh->initrd_addr_max) << 10);
   if (linux_mem_size != 0 && linux_mem_size < addr_max)
     addr_max = linux_mem_size;

@@ -612,7 +612,8 @@ grub_rescue_cmd_initrd (int argc, char *argv[])
   addr_max -= 0x10000;

   /* Usually, the compression ratio is about 50%.  */
-  addr_min = (grub_addr_t) prot_mode_mem + ((prot_mode_pages * 3) << 12);
+  addr_min = (grub_addr_t) prot_mode_mem + ((prot_mode_pages * 3) << 12)
+             + page_align (size);

   /* Find the highest address to put the initrd.  */
   mmap_size = find_mmap_size ();
@@ -625,8 +626,6 @@ grub_rescue_cmd_initrd (int argc, char *argv[])
        desc = NEXT_MEMORY_DESCRIPTOR (desc, desc_size))
     {
       if (desc->type == GRUB_EFI_CONVENTIONAL_MEMORY
-         && desc->physical_start >= addr_min
-         && desc->physical_start + size < addr_max
          && desc->num_pages >= initrd_pages)
        {
          grub_efi_physical_address_t physical_end;
@@ -635,6 +634,9 @@ grub_rescue_cmd_initrd (int argc, char *argv[])
          if (physical_end > addr_max)
            physical_end = addr_max;

+          if (physical_end < addr_min)
+            continue;
+
          if (physical_end > addr)
            addr = physical_end - page_align (size);
        }


-- 
Bean




reply via email to

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