powerpc: move common register copy functions from signal_32.c to signal.c
authorMichal Suchanek <msuchanek@suse.de>
Fri, 20 Mar 2020 10:20:13 +0000 (11:20 +0100)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 2 Apr 2020 13:09:59 +0000 (00:09 +1100)
These functions are required for 64bit as well.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
Reviewed-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/9fd6d9b7c5e91fab21159fe23534a2f16b4962d3.1584699455.git.msuchanek@suse.de
arch/powerpc/kernel/signal.c
arch/powerpc/kernel/signal_32.c

index d215f95545537ababac1eb849baab01df0e1642a..4b0152108f61ad604d1970fda63c571f54bd94ee 100644 (file)
 #include <linux/syscalls.h>
 #include <asm/hw_breakpoint.h>
 #include <linux/uaccess.h>
+#include <asm/switch_to.h>
 #include <asm/unistd.h>
 #include <asm/debug.h>
 #include <asm/tm.h>
 
 #include "signal.h"
 
+#ifdef CONFIG_VSX
+unsigned long copy_fpr_to_user(void __user *to,
+                              struct task_struct *task)
+{
+       u64 buf[ELF_NFPREG];
+       int i;
+
+       /* save FPR copy to local buffer then write to the thread_struct */
+       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+               buf[i] = task->thread.TS_FPR(i);
+       buf[i] = task->thread.fp_state.fpscr;
+       return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_fpr_from_user(struct task_struct *task,
+                                void __user *from)
+{
+       u64 buf[ELF_NFPREG];
+       int i;
+
+       if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+               return 1;
+       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+               task->thread.TS_FPR(i) = buf[i];
+       task->thread.fp_state.fpscr = buf[i];
+
+       return 0;
+}
+
+unsigned long copy_vsx_to_user(void __user *to,
+                              struct task_struct *task)
+{
+       u64 buf[ELF_NVSRHALFREG];
+       int i;
+
+       /* save FPR copy to local buffer then write to the thread_struct */
+       for (i = 0; i < ELF_NVSRHALFREG; i++)
+               buf[i] = task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
+       return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
+}
+
+unsigned long copy_vsx_from_user(struct task_struct *task,
+                                void __user *from)
+{
+       u64 buf[ELF_NVSRHALFREG];
+       int i;
+
+       if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
+               return 1;
+       for (i = 0; i < ELF_NVSRHALFREG ; i++)
+               task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
+       return 0;
+}
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+unsigned long copy_ckfpr_to_user(void __user *to,
+                                 struct task_struct *task)
+{
+       u64 buf[ELF_NFPREG];
+       int i;
+
+       /* save FPR copy to local buffer then write to the thread_struct */
+       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+               buf[i] = task->thread.TS_CKFPR(i);
+       buf[i] = task->thread.ckfp_state.fpscr;
+       return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_ckfpr_from_user(struct task_struct *task,
+                                         void __user *from)
+{
+       u64 buf[ELF_NFPREG];
+       int i;
+
+       if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+               return 1;
+       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+               task->thread.TS_CKFPR(i) = buf[i];
+       task->thread.ckfp_state.fpscr = buf[i];
+
+       return 0;
+}
+
+unsigned long copy_ckvsx_to_user(void __user *to,
+                                 struct task_struct *task)
+{
+       u64 buf[ELF_NVSRHALFREG];
+       int i;
+
+       /* save FPR copy to local buffer then write to the thread_struct */
+       for (i = 0; i < ELF_NVSRHALFREG; i++)
+               buf[i] = task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
+       return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
+}
+
+unsigned long copy_ckvsx_from_user(struct task_struct *task,
+                                         void __user *from)
+{
+       u64 buf[ELF_NVSRHALFREG];
+       int i;
+
+       if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
+               return 1;
+       for (i = 0; i < ELF_NVSRHALFREG ; i++)
+               task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
+       return 0;
+}
+#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
+#else
+inline unsigned long copy_fpr_to_user(void __user *to,
+                                     struct task_struct *task)
+{
+       return __copy_to_user(to, task->thread.fp_state.fpr,
+                             ELF_NFPREG * sizeof(double));
+}
+
+inline unsigned long copy_fpr_from_user(struct task_struct *task,
+                                       void __user *from)
+{
+       return __copy_from_user(task->thread.fp_state.fpr, from,
+                             ELF_NFPREG * sizeof(double));
+}
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+inline unsigned long copy_ckfpr_to_user(void __user *to,
+                                        struct task_struct *task)
+{
+       return __copy_to_user(to, task->thread.ckfp_state.fpr,
+                             ELF_NFPREG * sizeof(double));
+}
+
+inline unsigned long copy_ckfpr_from_user(struct task_struct *task,
+                                                void __user *from)
+{
+       return __copy_from_user(task->thread.ckfp_state.fpr, from,
+                               ELF_NFPREG * sizeof(double));
+}
+#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
+#endif
+
 /* Log an error when sending an unhandled signal to a process. Controlled
  * through debug.exception-trace sysctl.
  */
index 1b090a76b4444729c4b8614b72277c1643539e92..4f96d29a22bf8f4955d6b8bce99a85388d552eee 100644 (file)
@@ -235,146 +235,6 @@ struct rt_sigframe {
        int                     abigap[56];
 };
 
-#ifdef CONFIG_VSX
-unsigned long copy_fpr_to_user(void __user *to,
-                              struct task_struct *task)
-{
-       u64 buf[ELF_NFPREG];
-       int i;
-
-       /* save FPR copy to local buffer then write to the thread_struct */
-       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-               buf[i] = task->thread.TS_FPR(i);
-       buf[i] = task->thread.fp_state.fpscr;
-       return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
-}
-
-unsigned long copy_fpr_from_user(struct task_struct *task,
-                                void __user *from)
-{
-       u64 buf[ELF_NFPREG];
-       int i;
-
-       if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
-               return 1;
-       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-               task->thread.TS_FPR(i) = buf[i];
-       task->thread.fp_state.fpscr = buf[i];
-
-       return 0;
-}
-
-unsigned long copy_vsx_to_user(void __user *to,
-                              struct task_struct *task)
-{
-       u64 buf[ELF_NVSRHALFREG];
-       int i;
-
-       /* save FPR copy to local buffer then write to the thread_struct */
-       for (i = 0; i < ELF_NVSRHALFREG; i++)
-               buf[i] = task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
-       return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
-}
-
-unsigned long copy_vsx_from_user(struct task_struct *task,
-                                void __user *from)
-{
-       u64 buf[ELF_NVSRHALFREG];
-       int i;
-
-       if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
-               return 1;
-       for (i = 0; i < ELF_NVSRHALFREG ; i++)
-               task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
-       return 0;
-}
-
-#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
-unsigned long copy_ckfpr_to_user(void __user *to,
-                                 struct task_struct *task)
-{
-       u64 buf[ELF_NFPREG];
-       int i;
-
-       /* save FPR copy to local buffer then write to the thread_struct */
-       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-               buf[i] = task->thread.TS_CKFPR(i);
-       buf[i] = task->thread.ckfp_state.fpscr;
-       return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
-}
-
-unsigned long copy_ckfpr_from_user(struct task_struct *task,
-                                         void __user *from)
-{
-       u64 buf[ELF_NFPREG];
-       int i;
-
-       if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
-               return 1;
-       for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-               task->thread.TS_CKFPR(i) = buf[i];
-       task->thread.ckfp_state.fpscr = buf[i];
-
-       return 0;
-}
-
-unsigned long copy_ckvsx_to_user(void __user *to,
-                                 struct task_struct *task)
-{
-       u64 buf[ELF_NVSRHALFREG];
-       int i;
-
-       /* save FPR copy to local buffer then write to the thread_struct */
-       for (i = 0; i < ELF_NVSRHALFREG; i++)
-               buf[i] = task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
-       return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
-}
-
-unsigned long copy_ckvsx_from_user(struct task_struct *task,
-                                         void __user *from)
-{
-       u64 buf[ELF_NVSRHALFREG];
-       int i;
-
-       if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
-               return 1;
-       for (i = 0; i < ELF_NVSRHALFREG ; i++)
-               task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
-       return 0;
-}
-#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
-#else
-inline unsigned long copy_fpr_to_user(void __user *to,
-                                     struct task_struct *task)
-{
-       return __copy_to_user(to, task->thread.fp_state.fpr,
-                             ELF_NFPREG * sizeof(double));
-}
-
-inline unsigned long copy_fpr_from_user(struct task_struct *task,
-                                       void __user *from)
-{
-       return __copy_from_user(task->thread.fp_state.fpr, from,
-                             ELF_NFPREG * sizeof(double));
-}
-
-#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
-inline unsigned long copy_ckfpr_to_user(void __user *to,
-                                        struct task_struct *task)
-{
-       return __copy_to_user(to, task->thread.ckfp_state.fpr,
-                             ELF_NFPREG * sizeof(double));
-}
-
-inline unsigned long copy_ckfpr_from_user(struct task_struct *task,
-                                                void __user *from)
-{
-       return __copy_from_user(task->thread.ckfp_state.fpr, from,
-                               ELF_NFPREG * sizeof(double));
-}
-#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
-#endif
-
 /*
  * Save the current user registers on the user stack.
  * We only save the altivec/spe registers if the process has used