]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix internal_clone for x32
authorH.J. Lu <hongjiu.lu@intel.com>
Wed, 6 Nov 2013 21:50:42 +0000 (21:50 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Wed, 6 Nov 2013 21:50:42 +0000 (13:50 -0800)
PR sanitizer/59018
* sanitizer_common/sanitizer_linux.cc (internal_clone): Allocate
2 64-bit integers to save and restore fn and arg.  Properly load
newtls/child_tidptr into r8/r10.

From-SVN: r204481

libsanitizer/ChangeLog
libsanitizer/sanitizer_common/sanitizer_linux.cc

index b874b13c4f39425e61b14569b951fdf8eaa373fb..6103d62b3290efbbf61e9b21057d90400ad81f5d 100644 (file)
@@ -1,3 +1,10 @@
+2013-11-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR sanitizer/59018
+       * sanitizer_common/sanitizer_linux.cc (internal_clone): Allocate
+       2 64-bit integers to save and restore fn and arg.  Properly load
+       newtls/child_tidptr into r8/r10.
+
 2013-11-05  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR sanitizer/59018
index e48bee5be6e2ae8ee72d23d74b1628107a1f3cda..2763313015ab27c8b7ae1abf4a2dbfb0136915ab 100644 (file)
@@ -772,9 +772,11 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
   if (!fn || !child_stack)
     return -EINVAL;
   CHECK_EQ(0, (uptr)child_stack % 16);
-  child_stack = (char *)child_stack - 2 * sizeof(void *);
-  ((void **)child_stack)[0] = (void *)(uptr)fn;
-  ((void **)child_stack)[1] = arg;
+  child_stack = (char *)child_stack - 2 * sizeof(unsigned long long);
+  ((unsigned long long *)child_stack)[0] = (uptr)fn;
+  ((unsigned long long *)child_stack)[1] = (uptr)arg;
+  register void *r8 __asm__ ("r8") = newtls;
+  register int *r10 __asm__ ("r10") = child_tidptr;
   __asm__ __volatile__(
                        /* %rax = syscall(%rax = __NR_clone,
                         *                %rdi = flags,
@@ -783,8 +785,6 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
                         *                %r8  = new_tls,
                         *                %r10 = child_tidptr)
                         */
-                       "movq   %6,%%r8\n"
-                       "movq   %7,%%r10\n"
                        ".cfi_endproc\n"
                        "syscall\n"
 
@@ -816,9 +816,9 @@ uptr internal_clone(int (*fn)(void *), void *child_stack, int flags, void *arg,
                          "S"(child_stack),
                          "D"(flags),
                          "d"(parent_tidptr),
-                         "r"(newtls),
-                         "r"(child_tidptr)
-                       : "rsp", "memory", "r8", "r10", "r11", "rcx");
+                         "r"(r8),
+                         "r"(r10)
+                       : "rsp", "memory", "r11", "rcx");
   return res;
 }
 #endif  // defined(__x86_64__)