mirror of https://gitee.com/openkylin/linux.git
c6x: sanitize copy_thread(), get rid of clone(2) wrapper, switch to generic clone()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
24465a40ba
commit
951b39619a
|
@ -41,10 +41,6 @@ extern long sys_fallocate_c6x(int fd, int mode,
|
|||
u32 len_lo, u32 len_hi);
|
||||
extern int sys_cache_sync(unsigned long s, unsigned long e);
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
extern asmlinkage long sys_c6x_clone(struct pt_regs *regs);
|
||||
|
||||
#include <asm-generic/syscalls.h>
|
||||
|
||||
#endif /* __ASM_C6X_SYSCALLS_H */
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
*/
|
||||
|
||||
#define __ARCH_WANT_SYS_EXECVE
|
||||
#define __ARCH_WANT_SYS_CLONE
|
||||
|
||||
/* Use the standard ABI for syscalls. */
|
||||
#include <asm-generic/unistd.h>
|
||||
|
|
|
@ -613,18 +613,6 @@ ENDPROC(sys_sigaltstack)
|
|||
;; Special system calls
|
||||
;; return address is in B3
|
||||
;;
|
||||
ENTRY(sys_clone)
|
||||
ADD .D1X SP,8,A4
|
||||
#ifdef CONFIG_C6X_BIG_KERNEL
|
||||
|| MVKL .S1 sys_c6x_clone,A0
|
||||
MVKH .S1 sys_c6x_clone,A0
|
||||
BNOP .S2X A0,5
|
||||
#else
|
||||
|| B .S2 sys_c6x_clone
|
||||
NOP 5
|
||||
#endif
|
||||
ENDPROC(sys_clone)
|
||||
|
||||
ENTRY(sys_rt_sigreturn)
|
||||
ADD .D1X SP,8,A4
|
||||
#ifdef CONFIG_C6X_BIG_KERNEL
|
||||
|
|
|
@ -112,22 +112,6 @@ void exit_thread(void)
|
|||
{
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(c6x_clone, struct pt_regs *, regs)
|
||||
{
|
||||
unsigned long clone_flags;
|
||||
unsigned long newsp;
|
||||
|
||||
/* syscall puts clone_flags in A4 and usp in B4 */
|
||||
clone_flags = regs->orig_a4;
|
||||
if (regs->b4)
|
||||
newsp = regs->b4;
|
||||
else
|
||||
newsp = regs->sp;
|
||||
|
||||
return do_fork(clone_flags, newsp, regs, 0, (int __user *)regs->a6,
|
||||
(int __user *)regs->b6);
|
||||
}
|
||||
|
||||
/*
|
||||
* Do necessary setup to start up a newly executed thread.
|
||||
*/
|
||||
|
@ -155,13 +139,13 @@ void start_thread(struct pt_regs *regs, unsigned int pc, unsigned long usp)
|
|||
*/
|
||||
int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
unsigned long ustk_size,
|
||||
struct task_struct *p, struct pt_regs *regs)
|
||||
struct task_struct *p, struct pt_regs *unused)
|
||||
{
|
||||
struct pt_regs *childregs;
|
||||
|
||||
childregs = task_pt_regs(p);
|
||||
|
||||
if (!regs) {
|
||||
if (unlikely(p->flags & PF_KTHREAD)) {
|
||||
/* case of __kernel_thread: we return to supervisor space */
|
||||
memset(childregs, 0, sizeof(struct pt_regs));
|
||||
childregs->sp = (unsigned long)(childregs + 1);
|
||||
|
@ -170,7 +154,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
childregs->a1 = ustk_size; /* argument */
|
||||
} else {
|
||||
/* Otherwise use the given stack */
|
||||
*childregs = *regs;
|
||||
*childregs = *current_pt_regs();
|
||||
if (usp)
|
||||
childregs->sp = usp;
|
||||
p->thread.pc = (unsigned long) ret_from_fork;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue