diff options
author | Elliott Hughes <enh@google.com> | 2014-05-09 21:28:05 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-05-09 21:28:05 +0000 |
commit | 8fa5c2528c04df00f9f9a3dc4047ae88d3f13524 (patch) | |
tree | 00eb71b5f78b12233f6526954fbcf76c3aecbaf0 | |
parent | b222097dae05dfbca8000a18e0629c6bca7584c4 (diff) | |
parent | fff3c0fdcf2a6f4301a238628fbf8182780a1612 (diff) | |
download | bionic-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.S | 19 | ||||
-rw-r--r-- | libc/arch-arm64/bionic/_setjmp.S | 8 | ||||
-rw-r--r-- | libc/arch-arm64/bionic/setjmp.S | 8 | ||||
-rw-r--r-- | libc/arch-x86/bionic/__bionic_clone.S | 14 | ||||
-rw-r--r-- | libc/arch-x86_64/bionic/__bionic_clone.S | 2 |
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. |