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.
This commit is contained in:
hollisb 2004-10-12 03:56:10 +00:00
parent 4d61feb07b
commit 4512e4f355
4 changed files with 59 additions and 5 deletions

View file

@ -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):

View 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;
/* 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. */

View file

@ -33,6 +33,9 @@
.long 0xffffffff /* virt-size */
.long 0x00030000 /* load-base */
.extern __bss_start
.extern _end
.text
.align 2
.globl _start
@ -44,8 +47,17 @@ _start:
li 2, 0
li 13, 0
/* 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
mr 3, 5
bl cmain
1: b 1b

View 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
uint32_t EXPORT_FUNC(grub_ieee1275_decode_int_4) (unsigned char *p);