* 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/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):
/* 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 *
/* 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. */
.long 0xffffffff /* virt-base */
.long 0xffffffff /* virt-size */
.long 0x00030000 /* load-base */
-
+
+.extern __bss_start
+.extern _end
+
.text
.align 2
.globl _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
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);