]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
2004-10-11 Hollis Blanchard <hollis@penguinppc.org>
authorhollisb <hollisb@localhost>
Tue, 12 Oct 2004 03:56:10 +0000 (03:56 +0000)
committerhollisb <hollisb@localhost>
Tue, 12 Oct 2004 03:56:10 +0000 (03:56 +0000)
    * 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
boot/powerpc/ieee1275/cmain.c
boot/powerpc/ieee1275/crt0.S
include/grub/powerpc/ieee1275/ieee1275.h

index 87c68875210c6f7f47d2779f06fac4e9accb2246..a0e3e40e0224678a1e8bffd49abf1d14eb1c71c0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2004-10-11  Hollis Blanchard  <hollis@penguinppc.org>
+
+       * 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  <hollis@penguinppc.org>
 
     * boot/powerpc/ieee1275/ieee1275.c (grub_ieee1275_claim):
index b24504261dbb16af7f7ee85ba9109cfcb2637792..0f936648220921edf6c6284395529c22d25f7309 100644 (file)
@@ -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;
+
 \f
 /* 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.  */
index 168999b7241af6517fded29afc887d431fabac47..868a83d9826ff9819d4736576abc9bf78ae48c81 100644 (file)
        .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
 
index 495fb85b8835083f306197c44eab502b32d3a10b..35ae94d71a5376fc62449edfd52faf7524ae0c4d 100644 (file)
@@ -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
+
 \f
 
 uint32_t EXPORT_FUNC(grub_ieee1275_decode_int_4) (unsigned char *p);