From 4512e4f355b25abfa815d74d4dbba9d994902533 Mon Sep 17 00:00:00 2001 From: hollisb Date: Tue, 12 Oct 2004 03:56:10 +0000 Subject: [PATCH] 2004-10-11 Hollis Blanchard * boot/powerpc/ieee1275/cmain.c (grub_ieee1275_flags): New global. (cmain): Accept 3 parameters. Test for 0xdeadbeef, indicating Old World Macintosh. If Old Wold, set flag in grub_ieee1275_flags; claim Open Firmware's memory for it; claim memory from _start to _end. * boot/powerpc/ieee1275/crt0.S (__bss_start): New extern. (_end): New extern. (_start): Zero BSS from __bss_start to _end. * include/grub/powerpc/ieee1275/ieee1275.h (grub_ieee1275_flags): New extern. (GRUB_IEEE1275_NO_PARTITION_0): New #define. --- ChangeLog | 13 +++++++++++ boot/powerpc/ieee1275/cmain.c | 28 ++++++++++++++++++++++-- boot/powerpc/ieee1275/crt0.S | 18 ++++++++++++--- include/grub/powerpc/ieee1275/ieee1275.h | 5 +++++ 4 files changed, 59 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 87c688752..a0e3e40e0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2004-10-11 Hollis Blanchard + + * boot/powerpc/ieee1275/cmain.c (grub_ieee1275_flags): New global. + (cmain): Accept 3 parameters. Test for 0xdeadbeef, indicating Old + World Macintosh. If Old Wold, set flag in grub_ieee1275_flags; claim + Open Firmware's memory for it; claim memory from _start to _end. + * boot/powerpc/ieee1275/crt0.S (__bss_start): New extern. + (_end): New extern. + (_start): Zero BSS from __bss_start to _end. + * include/grub/powerpc/ieee1275/ieee1275.h (grub_ieee1275_flags): + New extern. + (GRUB_IEEE1275_NO_PARTITION_0): New #define. + 2004-10-11 Hollis Blanchard * boot/powerpc/ieee1275/ieee1275.c (grub_ieee1275_claim): diff --git a/boot/powerpc/ieee1275/cmain.c b/boot/powerpc/ieee1275/cmain.c index b24504261..0f9366482 100644 --- a/boot/powerpc/ieee1275/cmain.c +++ b/boot/powerpc/ieee1275/cmain.c @@ -35,6 +35,8 @@ struct module_info /* OpenFirmware entry point passed to us from the real bootloader. */ intptr_t (*grub_ieee1275_entry_fn) (void *); +grub_uint32_t grub_ieee1275_flags; + /* Return a help text for this architecture. */ const char * @@ -48,14 +50,36 @@ help_arch (void) /* Setup the argument vector and pass control over to the main function. */ void -cmain (uint32_t firmware_entry) +cmain (uint32_t r3, uint32_t r4 __attribute__((unused)), uint32_t r5) { char **argv, args[256]; grub_ieee1275_phandle_t chosen; int argc = 0, actual; long batl, batu; - grub_ieee1275_entry_fn = (intptr_t (*)(void *)) firmware_entry; + if (r5 == 0xdeadbeef) + { + /* Entered from Old World stage1. */ + extern char _start; + extern char _end; + + grub_ieee1275_entry_fn = (intptr_t (*)(void *)) r3; + + grub_ieee1275_flags = GRUB_IEEE1275_NO_PARTITION_0; + + /* Old World Open Firmware may use 4M-5M without claiming it. */ + grub_ieee1275_claim (0x00400000, 0x00100000, 0, 0); + + /* Need to claim ourselves so we don't cannibalize our memory later. */ + if (grub_ieee1275_claim ((grub_addr_t) &_start, (grub_addr_t) &_end + - (grub_addr_t) &_start, 0, 0)) + abort(); + } + else + { + /* Assume we were entered from Open Firmware. */ + grub_ieee1275_entry_fn = (intptr_t (*)(void *)) r5; + } /* Initialize BAT registers to unmapped to not generate overlapping mappings below. */ diff --git a/boot/powerpc/ieee1275/crt0.S b/boot/powerpc/ieee1275/crt0.S index 168999b72..868a83d98 100644 --- a/boot/powerpc/ieee1275/crt0.S +++ b/boot/powerpc/ieee1275/crt0.S @@ -32,7 +32,10 @@ .long 0xffffffff /* virt-base */ .long 0xffffffff /* virt-size */ .long 0x00030000 /* load-base */ - + +.extern __bss_start +.extern _end + .text .align 2 .globl _start @@ -43,9 +46,18 @@ _start: li 2, 0 li 13, 0 - - mr 3, 5 + /* Stage1 won't zero BSS for us. In other cases, why not do it again? */ + lis 6, (__bss_start - 4)@h + ori 6, 6, (__bss_start - 4)@l + lis 7, (_end - 4)@h + ori 7, 7, (_end - 4)@l + subf 7, 6, 7 + srwi 7, 7, 2 /* We store 4 bytes at a time. */ + mtctr 7 +2: stwu 2, 4(6) /* We know r2 is already 0 from above. */ + bdnz 2b + bl cmain 1: b 1b diff --git a/include/grub/powerpc/ieee1275/ieee1275.h b/include/grub/powerpc/ieee1275/ieee1275.h index 495fb85b8..35ae94d71 100644 --- a/include/grub/powerpc/ieee1275/ieee1275.h +++ b/include/grub/powerpc/ieee1275/ieee1275.h @@ -44,6 +44,11 @@ typedef intptr_t grub_ieee1275_ihandle_t; typedef intptr_t grub_ieee1275_phandle_t; extern intptr_t (*grub_ieee1275_entry_fn) (void *); +extern grub_uint32_t grub_ieee1275_flags; + +/* Old World firmware fails seek when "dev:0" is opened. */ +#define GRUB_IEEE1275_NO_PARTITION_0 0x1 + uint32_t EXPORT_FUNC(grub_ieee1275_decode_int_4) (unsigned char *p);