From: Dave Kleikamp Date: Fri, 20 Mar 2015 21:38:42 +0000 (-0500) Subject: sparc64: restore prom_cif_stack X-Git-Tag: v4.1.12-92~147^2~3^2~9 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=44898a20ddb0971ef3a04db871436c9a41c998ba;p=users%2Fjedix%2Flinux-maple.git 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 --- diff --git a/arch/sparc/include/asm/oplib_64.h b/arch/sparc/include/asm/oplib_64.h index 2e3a4add8591b..1834b16c59759 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 13a9689776c57..f58c2567e8dc9 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 110b0d78b8641..d95db755828f3 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 545d8bb79b652..b2340f008ae06 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; }