]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - arch/x86/kernel/process_64.c
flagday: don't pass regs to copy_thread()
[mirror_ubuntu-bionic-kernel.git] / arch / x86 / kernel / process_64.c
index 16c6365e2b867c883805061f533349751f9bfbf0..6e68a6194965d66f07de49245bb177bb7e1f1cb7 100644 (file)
@@ -146,8 +146,7 @@ static inline u32 read_32bit_tls(struct task_struct *t, int tls)
 }
 
 int copy_thread(unsigned long clone_flags, unsigned long sp,
-               unsigned long arg,
-       struct task_struct *p, struct pt_regs *regs)
+               unsigned long arg, struct task_struct *p)
 {
        int err;
        struct pt_regs *childregs;
@@ -169,7 +168,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
        savesegment(ds, p->thread.ds);
        memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));
 
-       if (unlikely(!regs)) {
+       if (unlikely(p->flags & PF_KTHREAD)) {
                /* kernel thread */
                memset(childregs, 0, sizeof(struct pt_regs));
                childregs->sp = (unsigned long)childregs;
@@ -181,10 +180,11 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
                childregs->flags = X86_EFLAGS_IF | X86_EFLAGS_BIT1;
                return 0;
        }
-       *childregs = *regs;
+       *childregs = *current_pt_regs();
 
        childregs->ax = 0;
-       childregs->sp = sp;
+       if (sp)
+               childregs->sp = sp;
 
        err = -ENOMEM;
        memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));