* 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); _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel