arc: clone: Fix CLONE_THREAD detection
commitb2c2bbcc8ccd0d0b281db653d22e568b8871ad46
authorAlexey Brodkin <Alexey.Brodkin@synopsys.com>
Fri, 29 Jul 2016 09:17:19 +0000 (29 12:17 +0300)
committerWaldemar Brodkorb <wbx@uclibc-ng.org>
Sun, 31 Jul 2016 10:50:54 +0000 (31 12:50 +0200)
tree24a23d43d39ad86b6d058ae39c6d57f04859a7ad
parent25f4ae1de711b2001b4958d65e77b6dba222e7b5
arc: clone: Fix CLONE_THREAD detection

For thread group case (CLONE_THREAD), the cached PID of new process/thread
need not be reset. The old logic to decide that was flawed as it would be
true only for exact combination of CLONE_THREAD + _VM, but would fail for
CLONE_THREAD + _VM + _xyz.

More detailed tear-down of current and new code below.

Current implementation is:
--------------------->8--------------------
                               ; r12 contains clone flags
  mov_s   r2, CLONE_THREAD_N_VM; r2 contains bit mask
  and_s   r2, r2, r12          ; r2 contains bit mask AND clone flags
                               ;   but r12 still contains the same flags
  brne    r2, r12, .Lgo_thread ; here we compare modified mask with
                               ;   flags as they were and skip pthread TID/PID
                               ;   setup if r2 != r12 which happens all
                               ;   the time except clone flags were
                               ;   exactly CLONE_THREAD | CLONE_VM
--------------------->8--------------------

New implementation is:
--------------------->8--------------------
                               ; r12 contains clone flags
  mov_s   r2, CLONE_THREAD_N_VM; r2 contains bit mask
  and_s   r12, r12, r2         ; r12 contains clone flags AND bit mask
                               ;   i.e. we did mask all flags except
                               ;   CLONE_THREAD and CLONE_VM
  breq    r2, r12, .Lgo_thread ; here we compare masked flags with
                               ;   target mask and if they match we skip
                               ;   pthread TID/PID setup
--------------------->8--------------------

Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
Acked-by: Vineet Gupta <vgupta@synopsys.com>
libc/sysdeps/linux/arc/clone.S