diff -Nru a/arch/ppc64/kernel/rtas.c b/arch/ppc64/kernel/rtas.c --- a/arch/ppc64/kernel/rtas.c Wed Mar 10 17:48:13 2004 +++ b/arch/ppc64/kernel/rtas.c Wed Mar 10 17:48:13 2004 @@ -421,14 +421,19 @@ } void -rtas_os_term(void) +rtas_os_term(char *str) { long status; - char *str = "OS panic"; + char buf[1035]; - status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL, __pa(str)); - if (status != 0) - printk(KERN_EMERG "ibm,os-term call failed %ld\n", status); + sprintf(buf, "OS panic: %s", str); + do { + status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL, __pa(buf)); + if (status == RTAS_BUSY) + udelay(1); + else if (status != 0) + printk(KERN_EMERG "ibm,os-term call failed %ld\n", status); + } while (status != RTAS_BUSY); } diff -Nru a/arch/ppc64/kernel/setup.c b/arch/ppc64/kernel/setup.c --- a/arch/ppc64/kernel/setup.c Wed Mar 10 17:48:13 2004 +++ b/arch/ppc64/kernel/setup.c Wed Mar 10 17:48:13 2004 @@ -331,7 +331,7 @@ static int ppc64_panic_event(struct notifier_block *this, unsigned long event, void *ptr) { - ppc_md.panic(); /* May not return */ + ppc_md.panic((char *)ptr); /* May not return */ return NOTIFY_DONE; } diff -Nru a/include/asm-ppc64/machdep.h b/include/asm-ppc64/machdep.h --- a/include/asm-ppc64/machdep.h Wed Mar 10 17:48:13 2004 +++ b/include/asm-ppc64/machdep.h Wed Mar 10 17:48:13 2004 @@ -82,7 +82,7 @@ void (*restart)(char *cmd); void (*power_off)(void); void (*halt)(void); - void (*panic)(void); + void (*panic)(char *str); int (*set_rtc_time)(struct rtc_time *); void (*get_rtc_time)(struct rtc_time *); diff -Nru a/include/asm-ppc64/rtas.h b/include/asm-ppc64/rtas.h --- a/include/asm-ppc64/rtas.h Wed Mar 10 17:48:13 2004 +++ b/include/asm-ppc64/rtas.h Wed Mar 10 17:48:13 2004 @@ -175,7 +175,7 @@ extern void rtas_restart(char *cmd); extern void rtas_power_off(void); extern void rtas_halt(void); -extern void rtas_os_term(void); +extern void rtas_os_term(char *str); extern int rtas_get_sensor(int sensor, int index, int *state); extern int rtas_get_power_level(int powerdomain, int *level); extern int rtas_set_indicator(int indicator, int index, int new_value);