summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2014-05-09 21:28:05 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2014-05-09 21:28:05 +0000
commit8fa5c2528c04df00f9f9a3dc4047ae88d3f13524 (patch)
tree00eb71b5f78b12233f6526954fbcf76c3aecbaf0
parentb222097dae05dfbca8000a18e0629c6bca7584c4 (diff)
parentfff3c0fdcf2a6f4301a238628fbf8182780a1612 (diff)
downloadbionic-8fa5c2528c04df00f9f9a3dc4047ae88d3f13524.zip
bionic-8fa5c2528c04df00f9f9a3dc4047ae88d3f13524.tar.gz
bionic-8fa5c2528c04df00f9f9a3dc4047ae88d3f13524.tar.bz2
Merge "Align arm64 stacks to 16 bytes in __bionic_clone."
-rw-r--r--libc/arch-arm64/bionic/__bionic_clone.S19
-rw-r--r--libc/arch-arm64/bionic/_setjmp.S8
-rw-r--r--libc/arch-arm64/bionic/setjmp.S8
-rw-r--r--libc/arch-x86/bionic/__bionic_clone.S14
-rw-r--r--libc/arch-x86_64/bionic/__bionic_clone.S2
5 files changed, 29 insertions, 22 deletions
diff --git a/libc/arch-arm64/bionic/__bionic_clone.S b/libc/arch-arm64/bionic/__bionic_clone.S
index af91320..74db790 100644
--- a/libc/arch-arm64/bionic/__bionic_clone.S
+++ b/libc/arch-arm64/bionic/__bionic_clone.S
@@ -35,29 +35,36 @@ ENTRY(__bionic_clone)
mov x29, sp
str x8, [sp, #-16]!
- /* store thread pointer & args in child stack */
+ # Align 'child_stack' to 16 bytes.
+ and x1, x1, #~0xf
+
+ # Copy 'fn' and 'arg' onto the child stack.
stp x5, x6, [x1, #-16]
- /* sys_clone */
+ # Zero out the top 32 bits of 'flags'. (Is this necessary?)
uxtw x0, w0
+
+ # Make the system call.
mov x8, __NR_clone
svc #0
- /* check for child/parent */
- cbz x0,1f
+ # Are we the child?
+ cbz x0, .L_bc_child
ldr x8, [sp], #16
ldp x29, x30, [sp], #16
+ # Set errno if something went wrong.
cmn x0, #(MAX_ERRNO + 1)
cneg x0, x0, hi
b.hi __set_errno
ret
- /* thread initialization - set the end of the frame record chain */
-1:
+.L_bc_child:
+ # We're in the child now. Set the end of the frame record chain...
mov x29, xzr
+ # ...and call __bionic_clone_entry with the 'fn' and 'arg' we stored on the child stack.
ldp x0, x1, [sp, #-16]
b __bionic_clone_entry
END(__bionic_clone)
diff --git a/libc/arch-arm64/bionic/_setjmp.S b/libc/arch-arm64/bionic/_setjmp.S
index dfa861b..3836899 100644
--- a/libc/arch-arm64/bionic/_setjmp.S
+++ b/libc/arch-arm64/bionic/_setjmp.S
@@ -73,7 +73,7 @@ ENTRY(_longjmp)
ldr w9, .L_setjmp_magic
ldr w10, [x0, #(_JB_MAGIC * 4)]
cmp w9, w10
- b.ne botch
+ b.ne .L_fail
/* restore core registers */
ldp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)]
@@ -93,10 +93,10 @@ ENTRY(_longjmp)
/* validate sp (sp mod 16 = 0) and lr (lr mod 4 = 0) */
tst x30, #3
- b.ne botch
+ b.ne .L_fail
mov x10, sp
tst x10, #15
- b.ne botch
+ b.ne .L_fail
/* set return value */
cmp w1, wzr
@@ -104,7 +104,7 @@ ENTRY(_longjmp)
ret
/* validation failed, die die die */
-botch:
+.L_fail:
bl PIC_SYM(longjmperror, PLT)
bl PIC_SYM(abort, PLT)
b . - 8 /* Cannot get here */
diff --git a/libc/arch-arm64/bionic/setjmp.S b/libc/arch-arm64/bionic/setjmp.S
index 9a68d86..f9d2266 100644
--- a/libc/arch-arm64/bionic/setjmp.S
+++ b/libc/arch-arm64/bionic/setjmp.S
@@ -85,7 +85,7 @@ ENTRY(longjmp)
ldr w9, .L_setjmp_magic
ldr w10, [x0, #(_JB_MAGIC * 4)]
cmp w9, w10
- b.ne botch
+ b.ne .L_fail
/* restore core registers */
ldp x30, x10, [x0, #(_JB_CORE_BASE * 4 + 16 * 0)]
@@ -105,10 +105,10 @@ ENTRY(longjmp)
/* validate sp (sp mod 16 = 0) and lr (lr mod 4 = 0) */
tst x30, #3
- b.ne botch
+ b.ne .L_fail
mov x10, sp
tst x10, #15
- b.ne botch
+ b.ne .L_fail
/* set return value */
cmp w1, wzr
@@ -116,7 +116,7 @@ ENTRY(longjmp)
ret
/* validation failed, die die die */
-botch:
+.L_fail:
bl PIC_SYM(longjmperror, PLT)
bl PIC_SYM(abort, PLT)
b . - 8 /* Cannot get here */
diff --git a/libc/arch-x86/bionic/__bionic_clone.S b/libc/arch-x86/bionic/__bionic_clone.S
index bc7f71d..cb0a363 100644
--- a/libc/arch-x86/bionic/__bionic_clone.S
+++ b/libc/arch-x86/bionic/__bionic_clone.S
@@ -6,7 +6,7 @@ ENTRY(__bionic_clone)
pushl %esi
pushl %edi
- # Align child stack.
+ # Align 'child_stack' to 16 bytes.
movl 20(%esp), %ecx
andl $~15, %ecx
@@ -28,8 +28,8 @@ ENTRY(__bionic_clone)
# Check result.
cmpl $0, %eax
- je bc_child
- jg bc_parent
+ je .L_bc_child
+ jg .L_bc_parent
# An error occurred, so set errno and return -1.
negl %eax
@@ -37,15 +37,15 @@ ENTRY(__bionic_clone)
call __set_errno
addl $4, %esp
orl $-1, %eax
- jmp bc_return
+ jmp .L_bc_return
-bc_child:
+.L_bc_child:
call __bionic_clone_entry
hlt
-bc_parent:
+.L_bc_parent:
# we're the parent; nothing to do.
-bc_return:
+.L_bc_return:
popl %edi
popl %esi
popl %ebx
diff --git a/libc/arch-x86_64/bionic/__bionic_clone.S b/libc/arch-x86_64/bionic/__bionic_clone.S
index c2ebebd..62c9666 100644
--- a/libc/arch-x86_64/bionic/__bionic_clone.S
+++ b/libc/arch-x86_64/bionic/__bionic_clone.S
@@ -30,7 +30,7 @@
// pid_t __bionic_clone(int flags, void* child_stack, pid_t* parent_tid, void* tls, pid_t* child_tid, int (*fn)(void*), void* arg);
ENTRY(__bionic_clone)
- # Enforce 16-byte alignment for child stack.
+ # Align 'child_stack' to 16 bytes.
andq $~15, %rsi
# Copy 'fn' and 'arg' onto the child stack.