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);
|
u32 len_lo, u32 len_hi);
|
||||||
extern int sys_cache_sync(unsigned long s, unsigned long e);
|
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>
|
#include <asm-generic/syscalls.h>
|
||||||
|
|
||||||
#endif /* __ASM_C6X_SYSCALLS_H */
|
#endif /* __ASM_C6X_SYSCALLS_H */
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define __ARCH_WANT_SYS_EXECVE
|
#define __ARCH_WANT_SYS_EXECVE
|
||||||
|
#define __ARCH_WANT_SYS_CLONE
|
||||||
|
|
||||||
/* Use the standard ABI for syscalls. */
|
/* Use the standard ABI for syscalls. */
|
||||||
#include <asm-generic/unistd.h>
|
#include <asm-generic/unistd.h>
|
||||||
|
|
|
@ -613,18 +613,6 @@ ENDPROC(sys_sigaltstack)
|
||||||
;; Special system calls
|
;; Special system calls
|
||||||
;; return address is in B3
|
;; 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)
|
ENTRY(sys_rt_sigreturn)
|
||||||
ADD .D1X SP,8,A4
|
ADD .D1X SP,8,A4
|
||||||
#ifdef CONFIG_C6X_BIG_KERNEL
|
#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.
|
* 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,
|
int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||||
unsigned long ustk_size,
|
unsigned long ustk_size,
|
||||||
struct task_struct *p, struct pt_regs *regs)
|
struct task_struct *p, struct pt_regs *unused)
|
||||||
{
|
{
|
||||||
struct pt_regs *childregs;
|
struct pt_regs *childregs;
|
||||||
|
|
||||||
childregs = task_pt_regs(p);
|
childregs = task_pt_regs(p);
|
||||||
|
|
||||||
if (!regs) {
|
if (unlikely(p->flags & PF_KTHREAD)) {
|
||||||
/* case of __kernel_thread: we return to supervisor space */
|
/* case of __kernel_thread: we return to supervisor space */
|
||||||
memset(childregs, 0, sizeof(struct pt_regs));
|
memset(childregs, 0, sizeof(struct pt_regs));
|
||||||
childregs->sp = (unsigned long)(childregs + 1);
|
childregs->sp = (unsigned long)(childregs + 1);
|
||||||
|
@ -170,8 +154,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||||
childregs->a1 = ustk_size; /* argument */
|
childregs->a1 = ustk_size; /* argument */
|
||||||
} else {
|
} else {
|
||||||
/* Otherwise use the given stack */
|
/* Otherwise use the given stack */
|
||||||
*childregs = *regs;
|
*childregs = *current_pt_regs();
|
||||||
childregs->sp = usp;
|
if (usp)
|
||||||
|
childregs->sp = usp;
|
||||||
p->thread.pc = (unsigned long) ret_from_fork;
|
p->thread.pc = (unsigned long) ret_from_fork;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue