]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
tile: make the prolog of clone() more conformant
authorChris Metcalf <cmetcalf@tilera.com>
Thu, 25 Sep 2014 20:53:03 +0000 (16:53 -0400)
committerChris Metcalf <cmetcalf@tilera.com>
Mon, 6 Oct 2014 15:21:29 +0000 (11:21 -0400)
With this change we properly set up the frame first, and tear
it down last, doing argument checking only when the frame is set up.

ChangeLog
sysdeps/unix/sysv/linux/tile/clone.S

index 7dd6029d2c31ee6b284671cbc847d5442fafff53..0ab15a2c53e6557cc328389edd67487e80fd4ed2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2014-10-02  Chris Metcalf  <cmetcalf@tilera.com>
 
+       * sysdeps/unix/sysv/linux/tile/clone.S (__clone): Fix code
+       to set up frame more cleanly.
+
        * sysdeps/tile/memcmp.c: New file.
 
        * sysdeps/unix/sysv/linux/tile/sysconf.c: New file.
index f48dba523c7c0dd260961a638f9a1637f40c86c5..0e109f849e95e4203ccfd64a208fb17d1163496c 100644 (file)
 
        .text
 ENTRY (__clone)
-       /* sanity check arguments */
-       BEQZ r0, .Linvalid
-       BEQZ r1, .Linvalid
-
        /* Create a stack frame so we can pass callee-saves to new task. */
        {
         move r10, sp
@@ -71,6 +67,10 @@ ENTRY (__clone)
        ST r11, r32
        cfi_offset (r32, FRAME_R32 - FRAME_SIZE)
 
+       /* sanity check arguments */
+       BEQZ r0, .Linvalid
+       BEQZ r1, .Linvalid
+
        /* Make sure child stack is properly aligned, and set up the
           top frame so that we can call out of it immediately in the
           child.  Setting it up here means we fault in the parent if
@@ -120,6 +120,7 @@ ENTRY (__clone)
        swint1
        BEQZ r0, .Lthread_start  /* If in child task.  */
 
+.Ldone:
        /* Restore the callee-saved registers and return. */
        ADDLI_PTR lr, sp, FRAME_SIZE
        {
@@ -149,7 +150,7 @@ ENTRY (__clone)
 .Linvalid:
        {
         movei r1, EINVAL
-        j SYSCALL_ERROR_NAME
+        j .Ldone
        }
 
 /* This function expects to receive: