c6x: sanitize copy_thread(), get rid of clone(2) wrapper, switch to generic clone()
[profile/ivi/kernel-adaptation-intel-automotive.git] / arch / c6x / kernel / process.c
index 2770d9a..a3f9189 100644 (file)
@@ -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,8 +154,9 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
                childregs->a1 = ustk_size;      /* argument */
        } else {
                /* Otherwise use the given stack */
-               *childregs = *regs;
-               childregs->sp = usp;
+               *childregs = *current_pt_regs();
+               if (usp)
+                       childregs->sp = usp;
                p->thread.pc = (unsigned long) ret_from_fork;
        }