The signal code for ILP32 uses one extra function from signal32.c; it does not 
make sense to enable the whole signal32.c code so we move the function which 
was being used to signal.c.


Signed-off-by: Andrew Pinski <apin...@cavium.com>
---
 arch/arm64/kernel/signal.c   |   85 ++++++++++++++++++++++++++++++++++++++++++
 arch/arm64/kernel/signal32.c |   81 ----------------------------------------
 2 files changed, 85 insertions(+), 81 deletions(-)

diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
index d97a0c0..5986b7f 100644
--- a/arch/arm64/kernel/signal.c
+++ b/arch/arm64/kernel/signal.c
@@ -249,3 +249,88 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
                tracehook_notify_resume(regs);
        }
 }
+
+
+#ifdef CONFIG_COMPAT
+int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
+{
+       int err;
+
+       if (!access_ok(VERIFY_WRITE, to, sizeof(*to)))
+               return -EFAULT;
+
+       /* If you change siginfo_t structure, please be sure
+        * this code is fixed accordingly.
+        * It should never copy any pad contained in the structure
+        * to avoid security leaks, but must copy the generic
+        * 3 ints plus the relevant union member.
+        * This routine must convert siginfo from 64bit to 32bit as well
+        * at the same time.
+        */
+       err = __put_user(from->si_signo, &to->si_signo);
+       err |= __put_user(from->si_errno, &to->si_errno);
+       err |= __put_user((short)from->si_code, &to->si_code);
+       if (from->si_code < 0)
+               err |= __copy_to_user(&to->_sifields._pad, 
&from->_sifields._pad,
+                                     SI_PAD_SIZE);
+       else switch (from->si_code & __SI_MASK) {
+       case __SI_KILL:
+               err |= __put_user(from->si_pid, &to->si_pid);
+               err |= __put_user(from->si_uid, &to->si_uid);
+               break;
+       case __SI_TIMER:
+                err |= __put_user(from->si_tid, &to->si_tid);
+                err |= __put_user(from->si_overrun, &to->si_overrun);
+                err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr,
+                                  &to->si_ptr);
+               break;
+       case __SI_POLL:
+               err |= __put_user(from->si_band, &to->si_band);
+               err |= __put_user(from->si_fd, &to->si_fd);
+               break;
+       case __SI_FAULT:
+               err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr,
+                                 &to->si_addr);
+#ifdef BUS_MCEERR_AO
+               /*
+                * Other callers might not initialize the si_lsb field,
+                * so check explicitely for the right codes here.
+                */
+               if (from->si_code == BUS_MCEERR_AR || from->si_code == 
BUS_MCEERR_AO)
+                       err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
+#endif
+               break;
+       case __SI_CHLD:
+               err |= __put_user(from->si_pid, &to->si_pid);
+               err |= __put_user(from->si_uid, &to->si_uid);
+               err |= __put_user(from->si_status, &to->si_status);
+               err |= __put_user(from->si_utime, &to->si_utime);
+               err |= __put_user(from->si_stime, &to->si_stime);
+               break;
+       case __SI_RT: /* This is not generated by the kernel as of now. */
+       case __SI_MESGQ: /* But this is */
+               err |= __put_user(from->si_pid, &to->si_pid);
+               err |= __put_user(from->si_uid, &to->si_uid);
+               err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, 
&to->si_ptr);
+               break;
+       default: /* this is just in case for now ... */
+               err |= __put_user(from->si_pid, &to->si_pid);
+               err |= __put_user(from->si_uid, &to->si_uid);
+               break;
+       }
+       return err;
+}
+
+int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
+{
+       memset(to, 0, sizeof *to);
+
+       if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) ||
+           copy_from_user(to->_sifields._pad,
+                          from->_sifields._pad, SI_PAD_SIZE))
+               return -EFAULT;
+
+       return 0;
+}
+#endif
+
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c
index e393174..dadcb6c 100644
--- a/arch/arm64/kernel/signal32.c
+++ b/arch/arm64/kernel/signal32.c
@@ -150,87 +150,6 @@ static inline int get_sigset_t(sigset_t *set,
        return 0;
 }
 
-int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
-{
-       int err;
-
-       if (!access_ok(VERIFY_WRITE, to, sizeof(*to)))
-               return -EFAULT;
-
-       /* If you change siginfo_t structure, please be sure
-        * this code is fixed accordingly.
-        * It should never copy any pad contained in the structure
-        * to avoid security leaks, but must copy the generic
-        * 3 ints plus the relevant union member.
-        * This routine must convert siginfo from 64bit to 32bit as well
-        * at the same time.
-        */
-       err = __put_user(from->si_signo, &to->si_signo);
-       err |= __put_user(from->si_errno, &to->si_errno);
-       err |= __put_user((short)from->si_code, &to->si_code);
-       if (from->si_code < 0)
-               err |= __copy_to_user(&to->_sifields._pad, 
&from->_sifields._pad,
-                                     SI_PAD_SIZE);
-       else switch (from->si_code & __SI_MASK) {
-       case __SI_KILL:
-               err |= __put_user(from->si_pid, &to->si_pid);
-               err |= __put_user(from->si_uid, &to->si_uid);
-               break;
-       case __SI_TIMER:
-                err |= __put_user(from->si_tid, &to->si_tid);
-                err |= __put_user(from->si_overrun, &to->si_overrun);
-                err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr,
-                                  &to->si_ptr);
-               break;
-       case __SI_POLL:
-               err |= __put_user(from->si_band, &to->si_band);
-               err |= __put_user(from->si_fd, &to->si_fd);
-               break;
-       case __SI_FAULT:
-               err |= __put_user((compat_uptr_t)(unsigned long)from->si_addr,
-                                 &to->si_addr);
-#ifdef BUS_MCEERR_AO
-               /*
-                * Other callers might not initialize the si_lsb field,
-                * so check explicitely for the right codes here.
-                */
-               if (from->si_code == BUS_MCEERR_AR || from->si_code == 
BUS_MCEERR_AO)
-                       err |= __put_user(from->si_addr_lsb, &to->si_addr_lsb);
-#endif
-               break;
-       case __SI_CHLD:
-               err |= __put_user(from->si_pid, &to->si_pid);
-               err |= __put_user(from->si_uid, &to->si_uid);
-               err |= __put_user(from->si_status, &to->si_status);
-               err |= __put_user(from->si_utime, &to->si_utime);
-               err |= __put_user(from->si_stime, &to->si_stime);
-               break;
-       case __SI_RT: /* This is not generated by the kernel as of now. */
-       case __SI_MESGQ: /* But this is */
-               err |= __put_user(from->si_pid, &to->si_pid);
-               err |= __put_user(from->si_uid, &to->si_uid);
-               err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, 
&to->si_ptr);
-               break;
-       default: /* this is just in case for now ... */
-               err |= __put_user(from->si_pid, &to->si_pid);
-               err |= __put_user(from->si_uid, &to->si_uid);
-               break;
-       }
-       return err;
-}
-
-int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
-{
-       memset(to, 0, sizeof *to);
-
-       if (copy_from_user(to, from, __ARCH_SI_PREAMBLE_SIZE) ||
-           copy_from_user(to->_sifields._pad,
-                          from->_sifields._pad, SI_PAD_SIZE))
-               return -EFAULT;
-
-       return 0;
-}
-
 /*
  * VFP save/restore code.
  */
-- 
1.7.2.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to