From 9b865de74b92cc27033705798a345afca17b3ebc Mon Sep 17 00:00:00 2001 From: Blue Swirl Date: Sun, 4 Jan 2009 19:25:41 +0000 Subject: [PATCH] Pass initrd parameters to preloaded Linux kernel like Yaboot does git-svn-id: svn://coreboot.org/openbios/openbios-devel@349 f158a5a8-5612-0410-a976-696ce0be7e32 --- arch/ppc/qemu/kernel.h | 2 +- arch/ppc/qemu/main.c | 9 +++++---- arch/ppc/qemu/start.S | 6 ++++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/arch/ppc/qemu/kernel.h b/arch/ppc/qemu/kernel.h index 666262e..d4d10f2 100644 --- a/arch/ppc/qemu/kernel.h +++ b/arch/ppc/qemu/kernel.h @@ -22,7 +22,7 @@ extern void exit( int status ); /* start.S */ extern void flush_icache_range( char *start, char *stop ); extern char of_rtas_start[], of_rtas_end[]; -extern void call_elf( ulong elf_entry ); +extern void call_elf( ulong arg1, ulong arg2, ulong elf_entry ); /* methods.c */ extern void node_methods_init( const char *cpuname ); diff --git a/arch/ppc/qemu/main.c b/arch/ppc/qemu/main.c index facf7d0..985071c 100644 --- a/arch/ppc/qemu/main.c +++ b/arch/ppc/qemu/main.c @@ -41,7 +41,7 @@ static void transfer_control_to_elf( ulong elf_entry ) { ELF_DPRINTF("Starting ELF boot loader\n"); - call_elf( elf_entry ); + call_elf( 0, 0, elf_entry ); fatal_error("call_elf returned unexpectedly\n"); } @@ -302,9 +302,10 @@ static void check_preloaded_kernel(void) cmdline = nvram_read_be32(0x40); initrd_image = nvram_read_be32(0x48); initrd_size = nvram_read_be32(0x4c); - printk("[ppc] Kernel already loaded (0x%8.8lx + 0x%8.8lx)\n", - kernel_image, kernel_size); - call_elf(kernel_image); + printk("[ppc] Kernel already loaded (0x%8.8lx + 0x%8.8lx) " + "(initrd 0x%8.8lx + 0x%8.8lx)\n", + kernel_image, kernel_size, initrd_image, initrd_size); + call_elf(initrd_image, initrd_size, kernel_image); } } diff --git a/arch/ppc/qemu/start.S b/arch/ppc/qemu/start.S index df98a61..07b540e 100644 --- a/arch/ppc/qemu/start.S +++ b/arch/ppc/qemu/start.S @@ -243,17 +243,19 @@ GLOBL(_entry): * r5 = clint interface handler * r6 = address of client program arguments (unused) * r7 = length of client program arguments (unsed) + * + * Yaboot and Linux use r3 and r4 for initrd address and size */ .data saved_stack: .long 0 .previous - /* void call_elf( entry ) */ + /* void call_elf( arg1, arg2, entry ) */ GLOBL(call_elf): mflr r0 stwu r1,-16(r1) stw r0,20(r1) - mtlr r3 + mtlr r5 lis r8,HA(saved_stack) addi r8,r8,LO(saved_stack) // save our stack pointer stw r1,0(r8)