powerpc: Rework syscall_get_arguments() so there is only one loop
authorMichael Ellerman <mpe@ellerman.id.au>
Thu, 23 Jul 2015 10:21:05 +0000 (20:21 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 29 Jul 2015 01:56:12 +0000 (11:56 +1000)
Currently syscall_get_arguments() has two loops, one for compat and one
for regular tasks. In prepartion for the next patch, which changes which
registers we use, switch it to only have one loop, so we only have one
place to update.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Reviewed-by: Kees Cook <keescook@chromium.org>
arch/powerpc/include/asm/syscall.h

index cabe90133e69aa60300b3765dd113aa1765b9975..403e2303fe18f627f4fe07cd98baf583f94bee37 100644 (file)
@@ -64,19 +64,16 @@ static inline void syscall_get_arguments(struct task_struct *task,
                                         unsigned int i, unsigned int n,
                                         unsigned long *args)
 {
+       unsigned long mask = -1UL;
+
        BUG_ON(i + n > 6);
-#ifdef CONFIG_PPC64
-       if (test_tsk_thread_flag(task, TIF_32BIT)) {
-               /*
-                * Zero-extend 32-bit argument values.  The high bits are
-                * garbage ignored by the actual syscall dispatch.
-                */
-               while (n-- > 0)
-                       args[n] = (u32) regs->gpr[3 + i + n];
-               return;
-       }
+
+#ifdef CONFIG_COMPAT
+       if (test_tsk_thread_flag(task, TIF_32BIT))
+               mask = 0xffffffff;
 #endif
-       memcpy(args, &regs->gpr[3 + i], n * sizeof(args[0]));
+       while (n--)
+               args[n] = regs->gpr[3 + i + n] & mask;
 }
 
 static inline void syscall_set_arguments(struct task_struct *task,