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:
parent
4d61feb07b
commit
4512e4f355
4 changed files with 59 additions and 5 deletions
13
ChangeLog
13
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):
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue