Commit a7657844 authored by Michael Ellerman's avatar Michael Ellerman

powerpc: Rework syscall_get_arguments() so there is only one loop

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: default avatarMichael Ellerman <mpe@ellerman.id.au>
Reviewed-by: default avatarKees Cook <keescook@chromium.org>
parent 1b1a3702
...@@ -64,19 +64,16 @@ static inline void syscall_get_arguments(struct task_struct *task, ...@@ -64,19 +64,16 @@ static inline void syscall_get_arguments(struct task_struct *task,
unsigned int i, unsigned int n, unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
unsigned long mask = -1UL;
BUG_ON(i + n > 6); BUG_ON(i + n > 6);
#ifdef CONFIG_PPC64
if (test_tsk_thread_flag(task, TIF_32BIT)) { #ifdef CONFIG_COMPAT
/* if (test_tsk_thread_flag(task, TIF_32BIT))
* Zero-extend 32-bit argument values. The high bits are mask = 0xffffffff;
* garbage ignored by the actual syscall dispatch.
*/
while (n-- > 0)
args[n] = (u32) regs->gpr[3 + i + n];
return;
}
#endif #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, static inline void syscall_set_arguments(struct task_struct *task,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment