mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
microblaze: fix clone syscall
Fix inadvertent breakage in the clone syscall ABI for Microblaze that
was introduced in commit f3268edbe6
("microblaze: switch to generic
fork/vfork/clone").
The Microblaze syscall ABI for clone takes the parent tid address in the
4th argument; the third argument slot is used for the stack size. The
incorrectly-used CLONE_BACKWARDS type assigned parent tid to the 3rd
slot.
This commit restores the original ABI so that existing userspace libc
code will work correctly.
All kernel versions from v3.8-rc1 were affected.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
41bb3476b3
commit
dfa9771a7c
4 changed files with 18 additions and 1 deletions
|
@ -407,6 +407,12 @@ config CLONE_BACKWARDS2
|
||||||
help
|
help
|
||||||
Architecture has the first two arguments of clone(2) swapped.
|
Architecture has the first two arguments of clone(2) swapped.
|
||||||
|
|
||||||
|
config CLONE_BACKWARDS3
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Architecture has tls passed as the 3rd argument of clone(2),
|
||||||
|
not the 5th one.
|
||||||
|
|
||||||
config ODD_RT_SIGACTION
|
config ODD_RT_SIGACTION
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
|
|
|
@ -28,7 +28,7 @@ config MICROBLAZE
|
||||||
select GENERIC_CLOCKEVENTS
|
select GENERIC_CLOCKEVENTS
|
||||||
select GENERIC_IDLE_POLL_SETUP
|
select GENERIC_IDLE_POLL_SETUP
|
||||||
select MODULES_USE_ELF_RELA
|
select MODULES_USE_ELF_RELA
|
||||||
select CLONE_BACKWARDS
|
select CLONE_BACKWARDS3
|
||||||
|
|
||||||
config SWAP
|
config SWAP
|
||||||
def_bool n
|
def_bool n
|
||||||
|
|
|
@ -802,9 +802,14 @@ asmlinkage long sys_vfork(void);
|
||||||
asmlinkage long sys_clone(unsigned long, unsigned long, int __user *, int,
|
asmlinkage long sys_clone(unsigned long, unsigned long, int __user *, int,
|
||||||
int __user *);
|
int __user *);
|
||||||
#else
|
#else
|
||||||
|
#ifdef CONFIG_CLONE_BACKWARDS3
|
||||||
|
asmlinkage long sys_clone(unsigned long, unsigned long, int, int __user *,
|
||||||
|
int __user *, int);
|
||||||
|
#else
|
||||||
asmlinkage long sys_clone(unsigned long, unsigned long, int __user *,
|
asmlinkage long sys_clone(unsigned long, unsigned long, int __user *,
|
||||||
int __user *, int);
|
int __user *, int);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
asmlinkage long sys_execve(const char __user *filename,
|
asmlinkage long sys_execve(const char __user *filename,
|
||||||
const char __user *const __user *argv,
|
const char __user *const __user *argv,
|
||||||
|
|
|
@ -1679,6 +1679,12 @@ SYSCALL_DEFINE5(clone, unsigned long, newsp, unsigned long, clone_flags,
|
||||||
int __user *, parent_tidptr,
|
int __user *, parent_tidptr,
|
||||||
int __user *, child_tidptr,
|
int __user *, child_tidptr,
|
||||||
int, tls_val)
|
int, tls_val)
|
||||||
|
#elif defined(CONFIG_CLONE_BACKWARDS3)
|
||||||
|
SYSCALL_DEFINE6(clone, unsigned long, clone_flags, unsigned long, newsp,
|
||||||
|
int, stack_size,
|
||||||
|
int __user *, parent_tidptr,
|
||||||
|
int __user *, child_tidptr,
|
||||||
|
int, tls_val)
|
||||||
#else
|
#else
|
||||||
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
|
SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
|
||||||
int __user *, parent_tidptr,
|
int __user *, parent_tidptr,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue