Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk --- openbios-devel/arch/ppc/qemu/context.c | 15 +++++++++++++++ openbios-devel/arch/ppc/qemu/init.c | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/openbios-devel/arch/ppc/qemu/context.c b/openbios-devel/arch/ppc/qemu/context.c index 93b6175..78205a2 100644 --- a/openbios-devel/arch/ppc/qemu/context.c +++ b/openbios-devel/arch/ppc/qemu/context.c @@ -32,6 +32,7 @@ void __exit_context(void); /* assembly routine */
unsigned int start_elf(unsigned long entry_point, unsigned long param); void entry(void); +void of_client_callback(void);
/* * Main context structure @@ -116,8 +117,22 @@ unsigned int start_elf(unsigned long entry_point, unsigned long param) { struct context *ctx;
+ /* According to IEEE 1275, PPC bindings: + * + * MSR = FP, ME + (DR|IR) + * r1 = stack (32 K + 32 bytes link area above) + * r5 = client interface handler + * r6 = address of client program arguments (unused) + * r7 = length of client program arguments (unused) + * + * Yaboot and Linux use r3 and r4 for initrd address and size + */ + ctx = init_context(image_stack, sizeof image_stack, 1); ctx->pc = entry_point; + ctx->regs[REG_R5] = (unsigned long)of_client_callback; + ctx->regs[REG_R6] = 0; + ctx->regs[REG_R7] = 0; ctx->param[0] = param;
ctx = switch_to(ctx); diff --git a/openbios-devel/arch/ppc/qemu/init.c b/openbios-devel/arch/ppc/qemu/init.c index b76c570..8f264f4 100644 --- a/openbios-devel/arch/ppc/qemu/init.c +++ b/openbios-devel/arch/ppc/qemu/init.c @@ -35,6 +35,7 @@ #define NO_QEMU_PROTOS #include "arch/common/fw_cfg.h" #include "arch/ppc/processor.h" +#include "context.h"
#define UUID_FMT "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x"
@@ -595,6 +596,7 @@ id_cpu(void) }
static void go(void); +unsigned int start_elf(unsigned long entry_point, unsigned long param);
static void go(void) @@ -609,7 +611,7 @@ go(void) feval("saved-program-state >sps.entry @"); addr = POP();
- call_elf(0, 0, addr); + start_elf((unsigned long)addr, 0); }
static void kvm_of_init(void)