Skip to content

Commit

Permalink
powerpc: Rework syscall_get_arguments() so there is only one loop
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Michael Ellerman committed Jul 29, 2015
1 parent 1b1a370 commit a765784
Showing 1 changed file with 8 additions and 11 deletions.
19 changes: 8 additions & 11 deletions arch/powerpc/include/asm/syscall.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit a765784

Please sign in to comment.