grub-devel
[Top][All Lists]
Advanced

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

[PATCH 3/3] Work around "CLAIM failed" on PowerMac


From: Pavel Roskin
Subject: [PATCH 3/3] Work around "CLAIM failed" on PowerMac
Date: Sat, 26 Jan 2008 18:28:23 -0500
User-agent: StGIT/0.14.1

* include/grub/powerpc/ieee1275/kernel.h: Introduce GRUB_MOD_GAP
to create a gap between _end and the modules added to the image
with grub-mkrescue.  That fixes "CLAIM failed" on PowerMAC.
* kern/powerpc/ieee1275/init.c: Use GRUB_MOD_GAP.
* util/elf/grub-mkimage.c (add_segments): Likewise.
---

 include/grub/powerpc/ieee1275/kernel.h |    5 +++++
 kern/powerpc/ieee1275/init.c           |    2 +-
 util/elf/grub-mkimage.c                |    2 +-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/include/grub/powerpc/ieee1275/kernel.h 
b/include/grub/powerpc/ieee1275/kernel.h
index 107b928..129ee20 100644
--- a/include/grub/powerpc/ieee1275/kernel.h
+++ b/include/grub/powerpc/ieee1275/kernel.h
@@ -23,6 +23,11 @@
 
 #define GRUB_MOD_ALIGN 0x1000
 
+/* Minimal gap between _end and the start of the modules.  It's a hack
+   for PowerMac to prevent "CLAIM failed" error.  The real fix is to
+   rewrite grub-mkimage to generate valid ELF files.  */
+#define GRUB_MOD_GAP 0x8000
+
 void EXPORT_FUNC (grub_reboot) (void);
 void EXPORT_FUNC (grub_halt) (void);
 
diff --git a/kern/powerpc/ieee1275/init.c b/kern/powerpc/ieee1275/init.c
index b38f017..6d08140 100644
--- a/kern/powerpc/ieee1275/init.c
+++ b/kern/powerpc/ieee1275/init.c
@@ -242,5 +242,5 @@ grub_get_rtc (void)
 grub_addr_t
 grub_arch_modules_addr (void)
 {
-  return ALIGN_UP(_end, GRUB_MOD_ALIGN);
+  return ALIGN_UP(_end + GRUB_MOD_GAP, GRUB_MOD_ALIGN);
 }
diff --git a/util/elf/grub-mkimage.c b/util/elf/grub-mkimage.c
index 9e44af1..316169f 100644
--- a/util/elf/grub-mkimage.c
+++ b/util/elf/grub-mkimage.c
@@ -218,7 +218,7 @@ add_segments (char *dir, FILE *out, int chrp, char *mods[])
       grub_addr_t modbase;
 
       /* Place modules just after grub segment.  */
-      modbase = ALIGN_UP(grub_end, GRUB_MOD_ALIGN);
+      modbase = ALIGN_UP(grub_end + GRUB_MOD_GAP, GRUB_MOD_ALIGN);
 
       /* Construct new segment header for modules.  */
       phdr = phdrs + grub_target_to_host16 (ehdr.e_phnum);




reply via email to

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