powerpc/signal: Call get_tm_stackpointer() from get_sigframe()
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Tue, 18 Aug 2020 17:19:22 +0000 (17:19 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 3 Dec 2020 14:01:12 +0000 (01:01 +1100)
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: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/abfdc105b8b28c4eb3ab9a26297d17f302b600ea.1597770847.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/signal.c
arch/powerpc/kernel/signal.h
arch/powerpc/kernel/signal_32.c
arch/powerpc/kernel/signal_64.c

index 1297b440ae78fe9658bd6c5656e01ba4479fa361..c3f61dc0a58945c949283f39413170e09968c835 100644 (file)
@@ -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,
-                          size_t frame_size, int is_32)
+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
index 6c2a33ab042c22ceb0d541089903cecab05e1881..fb98731348c39f4a373307b7026a237c248a4f8e 100644 (file)
@@ -10,8 +10,8 @@
 #ifndef _POWERPC_ARCH_SIGNAL_H
 #define _POWERPC_ARCH_SIGNAL_H
 
-extern void __user *get_sigframe(struct ksignal *ksig, unsigned long sp,
-                                 size_t frame_size, int is_32);
+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,
                           struct task_struct *tsk);
@@ -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);
index 61621acacc63d691737627fdedb24cd541a9346b..e5b2801a94acf7da89e0200d65f36e6db0e86a0e 100644 (file)
@@ -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;
index d3db7873207054b39a2893929dbeda9b75f2ca23..fec27d599e8702c5a771861b6b7eb06eea1bb69e 100644 (file)
@@ -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;