[PATCH v3 1/5] powerpc: Rename current_stack_pointer() to current_stack_frame()

Christophe Leroy christophe.leroy at c-s.fr
Fri Feb 21 00:26:38 AEDT 2020



Le 20/02/2020 à 12:51, Michael Ellerman a écrit :
> current_stack_pointer(), which was called __get_SP(), used to just
> return the value in r1.
> 
> But that caused problems in some cases, so it was turned into a
> function in commit bfe9a2cfe91a ("powerpc: Reimplement __get_SP() as a
> function not a define").
> 
> Because it's a function in a separate compilation unit to all its
> callers, it has the effect of causing a stack frame to be created, and
> then returns the address of that frame. This is good in some cases
> like those described in the above commit, but in other cases it's
> overkill, we just need to know what stack page we're on.
> 
> On some other arches current_stack_pointer is just a register global
> giving the stack pointer, and we'd like to do that too. So rename our
> current_stack_pointer() to current_stack_frame() to make that
> possible.
> 
> Signed-off-by: Michael Ellerman <mpe at ellerman.id.au>

LGTM

I was afraid to do that and risk invisible conflicts hence bugs by 
reusing the same name for different purpose, but that's the best 
solution for sure.

Reviewed-by: Christophe Leroy <christophe.leroy at c-s.fr>

> ---
>   arch/powerpc/include/asm/perf_event.h | 2 +-
>   arch/powerpc/include/asm/reg.h        | 2 +-
>   arch/powerpc/kernel/irq.c             | 4 ++--
>   arch/powerpc/kernel/misc.S            | 4 ++--
>   arch/powerpc/kernel/process.c         | 2 +-
>   arch/powerpc/kernel/stacktrace.c      | 6 +++---
>   6 files changed, 10 insertions(+), 10 deletions(-)
> 
> v3: New.
> 
> diff --git a/arch/powerpc/include/asm/perf_event.h b/arch/powerpc/include/asm/perf_event.h
> index 7426d7a90e1e..eed3954082fa 100644
> --- a/arch/powerpc/include/asm/perf_event.h
> +++ b/arch/powerpc/include/asm/perf_event.h
> @@ -32,7 +32,7 @@
>   	do {							\
>   		(regs)->result = 0;				\
>   		(regs)->nip = __ip;				\
> -		(regs)->gpr[1] = current_stack_pointer();	\
> +		(regs)->gpr[1] = current_stack_frame();		\
>   		asm volatile("mfmsr %0" : "=r" ((regs)->msr));	\
>   	} while (0)
>   
> diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
> index 1aa46dff0957..1b1ffdba6097 100644
> --- a/arch/powerpc/include/asm/reg.h
> +++ b/arch/powerpc/include/asm/reg.h
> @@ -1448,7 +1448,7 @@ static inline void mtsrin(u32 val, u32 idx)
>   
>   #define proc_trap()	asm volatile("trap")
>   
> -extern unsigned long current_stack_pointer(void);
> +extern unsigned long current_stack_frame(void);
>   
>   extern unsigned long scom970_read(unsigned int address);
>   extern void scom970_write(unsigned int address, unsigned long value);
> diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
> index 5c9b11878555..02118c18434d 100644
> --- a/arch/powerpc/kernel/irq.c
> +++ b/arch/powerpc/kernel/irq.c
> @@ -602,7 +602,7 @@ static inline void check_stack_overflow(void)
>   #ifdef CONFIG_DEBUG_STACKOVERFLOW
>   	long sp;
>   
> -	sp = current_stack_pointer() & (THREAD_SIZE-1);
> +	sp = current_stack_frame() & (THREAD_SIZE-1);
>   
>   	/* check for stack overflow: is there less than 2KB free? */
>   	if (unlikely(sp < 2048)) {
> @@ -647,7 +647,7 @@ void do_IRQ(struct pt_regs *regs)
>   	void *cursp, *irqsp, *sirqsp;
>   
>   	/* Switch to the irq stack to handle this */
> -	cursp = (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1));
> +	cursp = (void *)(current_stack_frame() & ~(THREAD_SIZE - 1));
>   	irqsp = hardirq_ctx[raw_smp_processor_id()];
>   	sirqsp = softirq_ctx[raw_smp_processor_id()];
>   
> diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S
> index 974f65f79a8e..65f9f731c229 100644
> --- a/arch/powerpc/kernel/misc.S
> +++ b/arch/powerpc/kernel/misc.S
> @@ -110,7 +110,7 @@ _GLOBAL(longjmp)
>   	li	r3, 1
>   	blr
>   
> -_GLOBAL(current_stack_pointer)
> +_GLOBAL(current_stack_frame)
>   	PPC_LL	r3,0(r1)
>   	blr
> -EXPORT_SYMBOL(current_stack_pointer)
> +EXPORT_SYMBOL(current_stack_frame)
> diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
> index e730b8e522b0..110db94cdf3c 100644
> --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -2051,7 +2051,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
>   	sp = (unsigned long) stack;
>   	if (sp == 0) {
>   		if (tsk == current)
> -			sp = current_stack_pointer();
> +			sp = current_stack_frame();
>   		else
>   			sp = tsk->thread.ksp;
>   	}
> diff --git a/arch/powerpc/kernel/stacktrace.c b/arch/powerpc/kernel/stacktrace.c
> index e2a46cfed5fd..c477b8585a29 100644
> --- a/arch/powerpc/kernel/stacktrace.c
> +++ b/arch/powerpc/kernel/stacktrace.c
> @@ -57,7 +57,7 @@ void save_stack_trace(struct stack_trace *trace)
>   {
>   	unsigned long sp;
>   
> -	sp = current_stack_pointer();
> +	sp = current_stack_frame();
>   
>   	save_context_stack(trace, sp, current, 1);
>   }
> @@ -71,7 +71,7 @@ void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
>   		return;
>   
>   	if (tsk == current)
> -		sp = current_stack_pointer();
> +		sp = current_stack_frame();
>   	else
>   		sp = tsk->thread.ksp;
>   
> @@ -131,7 +131,7 @@ static int __save_stack_trace_tsk_reliable(struct task_struct *tsk,
>   	}
>   
>   	if (tsk == current)
> -		sp = current_stack_pointer();
> +		sp = current_stack_frame();
>   	else
>   		sp = tsk->thread.ksp;
>   
> 


More information about the Linuxppc-dev mailing list