From 44898a20ddb0971ef3a04db871436c9a41c998ba Mon Sep 17 00:00:00 2001 From: Dave Kleikamp Date: Fri, 20 Mar 2015 16:38:42 -0500 Subject: [PATCH] sparc64: restore prom_cif_stack Commit ef3e035c stopped using the firmware stack and thus stopped saving it's location in p1275buf. However, kexec wants to be using the firmware stack when launching the new kernel. Signed-off-by: Dave Kleikamp --- arch/sparc/include/asm/oplib_64.h | 2 +- arch/sparc/kernel/head_64.S | 2 ++ arch/sparc/prom/init_64.c | 6 +++--- arch/sparc/prom/p1275.c | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/arch/sparc/include/asm/oplib_64.h b/arch/sparc/include/asm/oplib_64.h index 2e3a4add8591..1834b16c5975 100644 --- a/arch/sparc/include/asm/oplib_64.h +++ b/arch/sparc/include/asm/oplib_64.h @@ -62,7 +62,7 @@ struct linux_mem_p1275 { /* You must call prom_init() before using any of the library services, * preferably as early as possible. Pass it the romvec pointer. */ -void prom_init(void *cif_handler); +void prom_init(void *cif_handler, void *cif_stack); void prom_init_report(void); /* Boot argument acquisition, returns the boot command line string. */ diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index 13a9689776c5..f58c2567e8dc 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S @@ -687,6 +687,7 @@ tlb_fixup_done: sethi %hi(init_thread_union), %g6 or %g6, %lo(init_thread_union), %g6 ldx [%g6 + TI_TASK], %g4 + mov %sp, %l6 wr %g0, ASI_P, %asi mov 1, %g1 @@ -719,6 +720,7 @@ tlb_fixup_done: nop #endif + mov %l6, %o1 call prom_init mov %l7, %o0 ! OpenPROM cif handler diff --git a/arch/sparc/prom/init_64.c b/arch/sparc/prom/init_64.c index 110b0d78b864..d95db755828f 100644 --- a/arch/sparc/prom/init_64.c +++ b/arch/sparc/prom/init_64.c @@ -26,13 +26,13 @@ phandle prom_chosen_node; * It gets passed the pointer to the PROM vector. */ -extern void prom_cif_init(void *); +extern void prom_cif_init(void *, void *); -void __init prom_init(void *cif_handler) +void __init prom_init(void *cif_handler, void *cif_stack) { phandle node; - prom_cif_init(cif_handler); + prom_cif_init(cif_handler, cif_stack); prom_chosen_node = prom_finddevice(prom_chosen_path); if (!prom_chosen_node || (s32)prom_chosen_node == -1) diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c index 545d8bb79b65..b2340f008ae0 100644 --- a/arch/sparc/prom/p1275.c +++ b/arch/sparc/prom/p1275.c @@ -20,6 +20,7 @@ struct { long prom_callback; /* 0x00 */ void (*prom_cif_handler)(long *); /* 0x08 */ + unsigned long prom_cif_stack; /* 0x10 */ } p1275buf; extern void prom_world(int); @@ -51,4 +52,5 @@ void p1275_cmd_direct(unsigned long *args) void prom_cif_init(void *cif_handler, void *cif_stack) { p1275buf.prom_cif_handler = (void (*)(long *))cif_handler; + p1275buf.prom_cif_stack = (unsigned long)cif_stack; } -- 2.50.1