]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ia64: don't mess with ar_bspstore in kernel_thread()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 30 Sep 2012 04:27:40 +0000 (00:27 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Sun, 14 Oct 2012 23:33:54 +0000 (19:33 -0400)
the only thing we use that for is in copy_thread(), where the way
we set it will result in rbs_size being 0.  Just move that calculating
rbs_size and copying rbs to non-kernel-thread side of
if (user_mode(regs)) in copy_thread() and set rbs_size to 0 on
kernel thread side.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/ia64/kernel/process.c

index 63a77b8b5cfac076bd654922cb8339a68f775a17..6a48775d93632c1d7275c409c5a6deff6799ceee 100644 (file)
@@ -411,12 +411,11 @@ copy_thread(unsigned long clone_flags,
 
        rbs = (unsigned long) current + IA64_RBS_OFFSET;
        child_rbs = (unsigned long) p + IA64_RBS_OFFSET;
-       rbs_size = stack->ar_bspstore - rbs;
-
-       /* copy the parent's register backing store to the child: */
-       memcpy((void *) child_rbs, (void *) rbs, rbs_size);
 
        if (likely(user_mode(child_ptregs))) {
+               /* copy the parent's register backing store to the child: */
+               rbs_size = stack->ar_bspstore - rbs;
+               memcpy((void *) child_rbs, (void *) rbs, rbs_size);
                if (clone_flags & CLONE_SETTLS)
                        child_ptregs->r13 = regs->r16;  /* see sys_clone2() in entry.S */
                if (user_stack_base) {
@@ -433,6 +432,7 @@ copy_thread(unsigned long clone_flags,
                 * been taken care of by the caller of sys_clone()
                 * already.
                 */
+               rbs_size = 0;
                child_ptregs->r12 = (unsigned long) child_ptregs - 16; /* kernel sp */
                child_ptregs->r13 = (unsigned long) p;          /* set `current' pointer */
        }
@@ -637,7 +637,6 @@ kernel_thread (int (*fn)(void *), void *arg, unsigned long flags)
        regs.pt.cr_ipsr = ia64_getreg(_IA64_REG_PSR) | IA64_PSR_BN;
        regs.pt.cr_ifs = 1UL << 63;             /* mark as valid, empty frame */
        regs.sw.ar_fpsr = regs.pt.ar_fpsr = ia64_getreg(_IA64_REG_AR_FPSR);
-       regs.sw.ar_bspstore = (unsigned long) current + IA64_RBS_OFFSET;
        regs.sw.pr = (1 << PRED_KERNEL_STACK);
        return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs.pt, 0, NULL, NULL);
 }