Skip to content

Commit

Permalink
aarch64: Consolidate NPTL/non versions of clone
Browse files Browse the repository at this point in the history
At the same time, rely on non-clobbered registers across syscall
so that we eliminate the stack frame that we previously ignored
in the unwind info.
  • Loading branch information
Richard Henderson committed Jun 3, 2014
1 parent ccc3991 commit 111cc71
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 53 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2014-06-03 Richard Henderson <rth@redhat.com>

* sysdeps/unix/sysv/linux/aarch64/clone.S (__clone): Save args for
child in registers, not on the stack. Remove RESET_PID conditionals.
* sysdeps/unix/sysv/linux/aarch64/nptl/clone.S: Remove file.

2014-06-03 Marcus Shawcroft <marcus.shawcroft@arm.com>

* sysdeps/aarch64/libm-test-ulps: Regenerate.
Expand Down
56 changes: 24 additions & 32 deletions sysdeps/unix/sysv/linux/aarch64/clone.S
Original file line number Diff line number Diff line change
Expand Up @@ -39,66 +39,58 @@
*/
.text
ENTRY(__clone)
/* Save args for the child. */
mov x10, x0
mov x11, x2
mov x12, x3

/* Sanity check args. */
cbz x0, 1f
cbz x1, 1f
/* Insert the args onto the new stack. */
stp x0, x3, [x1, #-16]! /* Fn, arg. */
mov x0, #-EINVAL
cbz x10, .Lsyscall_error
cbz x1, .Lsyscall_error

/* Do the system call. */
/* X0:flags, x1:newsp, x2:parenttidptr, x3:newtls, x4:childtid. */
mov x0, x2 /* flags */

/* New sp is already in x1. */
mov x2, x4 /* ptid */
mov x3, x5 /* tls */
mov x4, x6 /* ctid */

#ifdef RESET_PID
/* We rely on the kernel preserving the argument regsiters across a
each system call so that we can inspect the flags against after
the clone call. */
mov x5, x0
#endif

mov x8, #SYS_ify(clone)
/* X0:flags, x1:newsp, x2:parenttidptr, x3:newtls, x4:childtid. */
svc 0x0
cfi_endproc

cmp x0, #0
beq 2f
blt 3f
beq thread_start
blt .Lsyscall_error
RET
1: mov x0, #-EINVAL
3:
b syscall_error
PSEUDO_END (__clone)

2:
.align 4
.type thread_start, %function
thread_start:
cfi_startproc
cfi_undefined (x30)
mov x29, 0
#ifdef RESET_PID
tbnz x5, #CLONE_THREAD_BIT, 3f

tbnz x11, #CLONE_THREAD_BIT, 3f
mov x0, #-1
tbnz x5, #CLONE_VM_BIT, 2f
tbnz x11, #CLONE_VM_BIT, 2f
mov x8, #SYS_ify(getpid)
svc 0x0
2:
mrs x1, tpidr_el0
sub x1, x1, #PTHREAD_SIZEOF
str w0, [x1, #PTHREAD_PID_OFFSET]
str w0, [x1, #PTHREAD_TID_OFFSET]

3:
#endif
/* Pick the function arg and call address from the stack and
execute. */
ldp x1, x0, [sp], #16
blr x1

/* Pick the function arg and execute. */
mov x0, x12
blr x10

/* We are done, pass the return value through x0. */
b HIDDEN_JUMPTARGET(_exit)
cfi_endproc
cfi_startproc
PSEUDO_END (__clone)
.size thread_start, .-thread_start

weak_alias (__clone, clone)
21 changes: 0 additions & 21 deletions sysdeps/unix/sysv/linux/aarch64/nptl/clone.S

This file was deleted.

0 comments on commit 111cc71

Please sign in to comment.