Commit c180cb30 authored by Christophe Leroy's avatar Christophe Leroy Committed by Michael Ellerman
Browse files

powerpc/signal: Call get_tm_stackpointer() from get_sigframe()



Instead of calling get_tm_stackpointer() from the caller, call it
directly from get_sigframe(). This avoids a double call and
allows get_tm_stackpointer() to become static and be inlined
into get_sigframe() by GCC.

Signed-off-by: default avatarChristophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/abfdc105b8b28c4eb3ab9a26297d17f302b600ea.1597770847.git.christophe.leroy@csgroup.eu
parent 0ecbc6ad
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -144,10 +144,13 @@ int show_unhandled_signals = 1;
/*
 * Allocate space for the signal frame
 */
void __user *get_sigframe(struct ksignal *ksig, unsigned long sp,
static unsigned long get_tm_stackpointer(struct task_struct *tsk);

void __user *get_sigframe(struct ksignal *ksig, struct task_struct *tsk,
			  size_t frame_size, int is_32)
{
        unsigned long oldsp, newsp;
	unsigned long sp = get_tm_stackpointer(tsk);

        /* Default to using normal stack */
	if (is_32)
@@ -300,7 +303,7 @@ void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
	user_enter();
}

unsigned long get_tm_stackpointer(struct task_struct *tsk)
static unsigned long get_tm_stackpointer(struct task_struct *tsk)
{
	/* When in an active transaction that takes a signal, we need to be
	 * careful with the stack.  It's possible that the stack has moved back
+2 −4
Original line number Diff line number Diff line
@@ -10,7 +10,7 @@
#ifndef _POWERPC_ARCH_SIGNAL_H
#define _POWERPC_ARCH_SIGNAL_H

extern void __user *get_sigframe(struct ksignal *ksig, unsigned long sp,
void __user *get_sigframe(struct ksignal *ksig, struct task_struct *tsk,
			  size_t frame_size, int is_32);

extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
@@ -19,8 +19,6 @@ extern int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
extern int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
			      struct task_struct *tsk);

extern unsigned long get_tm_stackpointer(struct task_struct *tsk);

#ifdef CONFIG_VSX
extern unsigned long copy_vsx_to_user(void __user *to,
				      struct task_struct *task);
+2 −2
Original line number Diff line number Diff line
@@ -766,7 +766,7 @@ int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,

	/* Set up Signal Frame */
	/* Put a Real Time Context onto stack */
	rt_sf = get_sigframe(ksig, get_tm_stackpointer(tsk), sizeof(*rt_sf), 1);
	rt_sf = get_sigframe(ksig, tsk, sizeof(*rt_sf), 1);
	addr = rt_sf;
	if (!access_ok(rt_sf, sizeof(*rt_sf)))
		goto badframe;
@@ -1226,7 +1226,7 @@ int handle_signal32(struct ksignal *ksig, sigset_t *oldset,
#endif

	/* Set up Signal Frame */
	frame = get_sigframe(ksig, get_tm_stackpointer(tsk), sizeof(*frame), 1);
	frame = get_sigframe(ksig, tsk, sizeof(*frame), 1);
	if (!access_ok(frame, sizeof(*frame)))
		goto badframe;
	sc = (struct sigcontext __user *) &frame->sctx;
+1 −1
Original line number Diff line number Diff line
@@ -822,7 +822,7 @@ int handle_rt_signal64(struct ksignal *ksig, sigset_t *set,
	unsigned long msr = regs->msr;
#endif

	frame = get_sigframe(ksig, get_tm_stackpointer(tsk), sizeof(*frame), 0);
	frame = get_sigframe(ksig, tsk, sizeof(*frame), 0);
	if (!access_ok(frame, sizeof(*frame)))
		goto badframe;