The current thread info can now be found from the thread_info_ptr. That can be used to find the task struct (indeed, a later patch will embed the thread_info in the task struct so these are one and the same). The kernel stack may then be determined from the value in the task struct. Replace the get_saved_sp macro with one which operates this way. Saving of the kernel SP on context switch etc is no longer necessary, so remove it. Signed-off-by: Matt Redfearn <matt.redfearn@xxxxxxxx> --- arch/mips/include/asm/stackframe.h | 77 ++++++++++++-------------------------- arch/mips/kernel/head.S | 2 - arch/mips/kernel/octeon_switch.S | 3 -- arch/mips/kernel/r2300_switch.S | 3 -- arch/mips/kernel/r4k_switch.S | 2 - arch/mips/kernel/setup.c | 1 - 6 files changed, 23 insertions(+), 65 deletions(-) diff --git a/arch/mips/include/asm/stackframe.h b/arch/mips/include/asm/stackframe.h index d83d148fec28..2ba65600a8d9 100644 --- a/arch/mips/include/asm/stackframe.h +++ b/arch/mips/include/asm/stackframe.h @@ -210,69 +210,37 @@ #endif /* - * get_saved_sp returns the SP for the current CPU by looking in the - * kernelsp array for it. If tosp is set, it stores the current sp in - * k0 and loads the new value in sp. If not, it clobbers k0 and - * stores the new value in k1, leaving sp unaffected. + * get_saved_sp returns the SP for the current CPU by finding the current + * thread_info, using get_saved_ti, finding the task_stack, and adding + * the kernel stack size to it. + * It stores the current sp in k0 and loads the new value in sp. The value + * in k1 is clobbered. */ -#ifdef CONFIG_SMP - /* SMP variation */ - .macro get_saved_sp docfi=0 tosp=0 - ASM_CPUID_MFC0 k0, ASM_SMP_CPUID_REG -#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) - lui k1, %hi(kernelsp) -#else - lui k1, %highest(kernelsp) - daddiu k1, %higher(kernelsp) - dsll k1, 16 - daddiu k1, %hi(kernelsp) - dsll k1, 16 -#endif - LONG_SRL k0, SMP_CPUID_PTRSHIFT - LONG_ADDU k1, k0 - .if \tosp + .macro get_saved_sp docfi=0 + /* Get current thread info into k1 */ + get_saved_ti k1, k0 + /* Get task struct into k1 */ + LONG_L k1, TI_TASK(k1) + /* Get the stack into k1 */ + LONG_L k1, TASK_STACK(k1) + /* Get starting stack location */ + .set at=k0 + PTR_ADDU k1, k1, _THREAD_SIZE - 32 + .set noat + + /* Save current SP to k0 */ move k0, sp .if \docfi .cfi_register sp, k0 .endif - LONG_L sp, %lo(kernelsp)(k1) - .else - LONG_L k1, %lo(kernelsp)(k1) - .endif - .endm - .macro set_saved_sp stackp temp temp2 - ASM_CPUID_MFC0 \temp, ASM_SMP_CPUID_REG - LONG_SRL \temp, SMP_CPUID_PTRSHIFT - LONG_S \stackp, kernelsp(\temp) - .endm -#else /* !CONFIG_SMP */ - /* Uniprocessor variation */ - .macro get_saved_sp docfi=0 tosp=0 -#if defined(CONFIG_32BIT) || defined(KBUILD_64BIT_SYM32) - lui k1, %hi(kernelsp) -#else - lui k1, %highest(kernelsp) - daddiu k1, %higher(kernelsp) - dsll k1, k1, 16 - daddiu k1, %hi(kernelsp) - dsll k1, k1, 16 -#endif - .if \tosp - move k0, sp + /* Activate new stack */ + move sp, k1 .if \docfi - .cfi_register sp, k0 - .endif - LONG_L sp, %lo(kernelsp)(k1) - .else - LONG_L k1, %lo(kernelsp)(k1) + .cfi_register k1, sp .endif - .endm - .macro set_saved_sp stackp temp temp2 - LONG_S \stackp, kernelsp .endm -#endif .macro SAVE_SOME docfi=0 .set push @@ -287,8 +255,9 @@ .cfi_register sp, k0 .endif .set reorder + /* Called from user mode, new stack. */ - get_saved_sp docfi=\docfi tosp=1 + get_saved_sp docfi=\docfi 8: #ifdef CONFIG_CPU_DADDI_WORKAROUNDS .set at=k1 diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S index c74f2e1f4b08..5a7e0dac8ada 100644 --- a/arch/mips/kernel/head.S +++ b/arch/mips/kernel/head.S @@ -136,7 +136,6 @@ dtb_found: PTR_ADDU sp, $28 back_to_back_c0_hazard set_saved_ti $28, t0 - set_saved_sp sp, t0, t1 PTR_SUBU sp, 4 * SZREG # init stack pointer #ifdef CONFIG_RELOCATABLE @@ -148,7 +147,6 @@ dtb_found: PTR_ADDU sp, v0 set_saved_ti $28, t0 - set_saved_sp sp, t0, t1 /* * Find start_kernel in relocated image and jump there diff --git a/arch/mips/kernel/octeon_switch.S b/arch/mips/kernel/octeon_switch.S index b0ef486ad6c1..8f2d80b9b8a4 100644 --- a/arch/mips/kernel/octeon_switch.S +++ b/arch/mips/kernel/octeon_switch.S @@ -75,9 +75,6 @@ cpu_restore_nonscratch a1 set_saved_ti $28, t0 - PTR_ADDU t0, $28, _THREAD_SIZE - 32 - set_saved_sp t0, t1, t2 - mfc0 t1, CP0_STATUS /* Do we really need this? */ li a3, 0xff01 and t1, a3 diff --git a/arch/mips/kernel/r2300_switch.S b/arch/mips/kernel/r2300_switch.S index 6e6c012dfc5e..db8186ed9b24 100644 --- a/arch/mips/kernel/r2300_switch.S +++ b/arch/mips/kernel/r2300_switch.S @@ -50,9 +50,6 @@ LEAF(resume) cpu_restore_nonscratch a1 set_saved_ti $28, t0 - addiu t1, $28, _THREAD_SIZE - 32 - sw t1, kernelsp - mfc0 t1, CP0_STATUS /* Do we really need this? */ li a3, 0xff01 and t1, a3 diff --git a/arch/mips/kernel/r4k_switch.S b/arch/mips/kernel/r4k_switch.S index 5afbbc1b4bd3..6428904a34c7 100644 --- a/arch/mips/kernel/r4k_switch.S +++ b/arch/mips/kernel/r4k_switch.S @@ -45,8 +45,6 @@ cpu_restore_nonscratch a1 set_saved_ti $28, t0 - PTR_ADDU t0, $28, _THREAD_SIZE - 32 - set_saved_sp t0, t1, t2 mfc0 t1, CP0_STATUS /* Do we really need this? */ li a3, 0xff01 and t1, a3 diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c index d7078589a077..53fbd5faff41 100644 --- a/arch/mips/kernel/setup.c +++ b/arch/mips/kernel/setup.c @@ -1024,7 +1024,6 @@ void __init setup_arch(char **cmdline_p) paging_init(); } -unsigned long kernelsp[NR_CPUS]; unsigned long thread_info_ptr[NR_CPUS]; unsigned long fw_arg0, fw_arg1, fw_arg2, fw_arg3; -- 2.7.4