Commit e8bb2a2a authored by Kars de Jong's avatar Kars de Jong Committed by Geert Uytterhoeven

m68k: Wire up clone3() syscall

Wire up the clone3() syscall for m68k. The special entry point is done in
assembler as was done for clone() as well. This is needed because all
registers need to be saved. The C wrapper then calls the generic
sys_clone3() with the correct arguments.

Tested on A1200 using the simple test program from:

  https://lore.kernel.org/lkml/20190716130631.tohj4ub54md25dys@brauner.io/Signed-off-by: default avatarKars de Jong <jongk@linux-m68k.org>
Link: https://lore.kernel.org/r/20191124195225.31230-1-jongk@linux-m68k.orgSigned-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 46cf053e
...@@ -30,5 +30,6 @@ ...@@ -30,5 +30,6 @@
#define __ARCH_WANT_SYS_SIGPROCMASK #define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_FORK #define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK #define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE3
#endif /* _ASM_M68K_UNISTD_H_ */ #endif /* _ASM_M68K_UNISTD_H_ */
...@@ -69,6 +69,13 @@ ENTRY(__sys_vfork) ...@@ -69,6 +69,13 @@ ENTRY(__sys_vfork)
lea %sp@(24),%sp lea %sp@(24),%sp
rts rts
ENTRY(__sys_clone3)
SAVE_SWITCH_STACK
pea %sp@(SWITCH_STACK_SIZE)
jbsr m68k_clone3
lea %sp@(28),%sp
rts
ENTRY(sys_sigreturn) ENTRY(sys_sigreturn)
SAVE_SWITCH_STACK SAVE_SWITCH_STACK
movel %sp,%sp@- | switch_stack pointer movel %sp,%sp@- | switch_stack pointer
......
...@@ -30,8 +30,9 @@ ...@@ -30,8 +30,9 @@
#include <linux/init_task.h> #include <linux/init_task.h>
#include <linux/mqueue.h> #include <linux/mqueue.h>
#include <linux/rcupdate.h> #include <linux/rcupdate.h>
#include <linux/syscalls.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/traps.h> #include <asm/traps.h>
#include <asm/machdep.h> #include <asm/machdep.h>
#include <asm/setup.h> #include <asm/setup.h>
...@@ -119,6 +120,16 @@ asmlinkage int m68k_clone(struct pt_regs *regs) ...@@ -119,6 +120,16 @@ asmlinkage int m68k_clone(struct pt_regs *regs)
(int __user *)regs->d3, (int __user *)regs->d4); (int __user *)regs->d3, (int __user *)regs->d4);
} }
/*
* Because extra registers are saved on the stack after the sys_clone3()
* arguments, this C wrapper extracts them from pt_regs * and then calls the
* generic sys_clone3() implementation.
*/
asmlinkage int m68k_clone3(struct pt_regs *regs)
{
return sys_clone3((struct clone_args __user *)regs->d1, regs->d2);
}
int copy_thread(unsigned long clone_flags, unsigned long usp, int copy_thread(unsigned long clone_flags, unsigned long usp,
unsigned long arg, struct task_struct *p) unsigned long arg, struct task_struct *p)
{ {
......
...@@ -434,4 +434,4 @@ ...@@ -434,4 +434,4 @@
432 common fsmount sys_fsmount 432 common fsmount sys_fsmount
433 common fspick sys_fspick 433 common fspick sys_fspick
434 common pidfd_open sys_pidfd_open 434 common pidfd_open sys_pidfd_open
# 435 reserved for clone3 435 common clone3 __sys_clone3
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