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>
|
2004-10-11 Hollis Blanchard <hollis@penguinppc.org>
|
||||||
|
|
||||||
* boot/powerpc/ieee1275/ieee1275.c (grub_ieee1275_claim):
|
* 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. */
|
/* OpenFirmware entry point passed to us from the real bootloader. */
|
||||||
intptr_t (*grub_ieee1275_entry_fn) (void *);
|
intptr_t (*grub_ieee1275_entry_fn) (void *);
|
||||||
|
|
||||||
|
grub_uint32_t grub_ieee1275_flags;
|
||||||
|
|
||||||
|
|
||||||
/* Return a help text for this architecture. */
|
/* Return a help text for this architecture. */
|
||||||
const char *
|
const char *
|
||||||
|
@ -48,14 +50,36 @@ help_arch (void)
|
||||||
/* Setup the argument vector and pass control over to the main
|
/* Setup the argument vector and pass control over to the main
|
||||||
function. */
|
function. */
|
||||||
void
|
void
|
||||||
cmain (uint32_t firmware_entry)
|
cmain (uint32_t r3, uint32_t r4 __attribute__((unused)), uint32_t r5)
|
||||||
{
|
{
|
||||||
char **argv, args[256];
|
char **argv, args[256];
|
||||||
grub_ieee1275_phandle_t chosen;
|
grub_ieee1275_phandle_t chosen;
|
||||||
int argc = 0, actual;
|
int argc = 0, actual;
|
||||||
long batl, batu;
|
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
|
/* Initialize BAT registers to unmapped to not generate overlapping
|
||||||
mappings below. */
|
mappings below. */
|
||||||
|
|
|
@ -32,7 +32,10 @@
|
||||||
.long 0xffffffff /* virt-base */
|
.long 0xffffffff /* virt-base */
|
||||||
.long 0xffffffff /* virt-size */
|
.long 0xffffffff /* virt-size */
|
||||||
.long 0x00030000 /* load-base */
|
.long 0x00030000 /* load-base */
|
||||||
|
|
||||||
|
.extern __bss_start
|
||||||
|
.extern _end
|
||||||
|
|
||||||
.text
|
.text
|
||||||
.align 2
|
.align 2
|
||||||
.globl _start
|
.globl _start
|
||||||
|
@ -43,9 +46,18 @@ _start:
|
||||||
|
|
||||||
li 2, 0
|
li 2, 0
|
||||||
li 13, 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
|
bl cmain
|
||||||
1: b 1b
|
1: b 1b
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,11 @@ typedef intptr_t grub_ieee1275_ihandle_t;
|
||||||
typedef intptr_t grub_ieee1275_phandle_t;
|
typedef intptr_t grub_ieee1275_phandle_t;
|
||||||
|
|
||||||
extern intptr_t (*grub_ieee1275_entry_fn) (void *);
|
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);
|
uint32_t EXPORT_FUNC(grub_ieee1275_decode_int_4) (unsigned char *p);
|
||||||
|
|
Loading…
Add table
Reference in a new issue