[compiler-rt] r191908 - asan/msan/tsan: fix broken linux syscalls

Dmitry Vyukov dvyukov at google.com
Thu Oct 3 09:53:50 PDT 2013


Author: dvyukov
Date: Thu Oct  3 11:53:50 2013
New Revision: 191908

URL: http://llvm.org/viewvc/llvm-project?rev=191908&view=rev
Log:
asan/msan/tsan: fix broken linux syscalls

Currently the following source code:

u64 NanoTime() {
  kernel_timeval tv = {};
  internal_syscall(__NR_gettimeofday, &tv, 0);
  return (u64)tv.tv_sec * 1000*1000*1000 + tv.tv_usec * 1000;
}

generates the following assembly:

Dump of assembler code for function __sanitizer::NanoTime():
=> 0x00007ff30657d380 <+0>:	lea    -0x10(%rsp),%rdi
   0x00007ff30657d385 <+5>:	xor    %esi,%esi
   0x00007ff30657d387 <+7>:	mov    $0x60,%eax
   0x00007ff30657d38c <+12>:	syscall 
   0x00007ff30657d38e <+14>:	mov    $0,%eax
   0x00007ff30657d393 <+19>:	retq   

with this change:

Dump of assembler code for function __sanitizer::NanoTime():
=> 0x00007faab834f380 <+0>:	movq   $0x0,-0x10(%rsp)
   0x00007faab834f389 <+9>:	movq   $0x0,-0x8(%rsp)
   0x00007faab834f392 <+18>:	lea    -0x10(%rsp),%rdi
   0x00007faab834f397 <+23>:	xor    %esi,%esi
   0x00007faab834f399 <+25>:	mov    $0x60,%eax
   0x00007faab834f39e <+30>:	syscall 
   0x00007faab834f3a0 <+32>:	mov    -0x8(%rsp),%rax
   0x00007faab834f3a5 <+37>:	mov    -0x10(%rsp),%rcx
   0x00007faab834f3aa <+42>:	imul   $0x3e8,%rax,%rdx
   0x00007faab834f3b1 <+49>:	imul   $0x3b9aca00,%rcx,%rax
   0x00007faab834f3b8 <+56>:	add    %rdx,%rax
   0x00007faab834f3bb <+59>:	retq   



Modified:
    compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_linux_x86_64.inc

Modified: compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_linux_x86_64.inc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_linux_x86_64.inc?rev=191908&r1=191907&r2=191908&view=diff
==============================================================================
--- compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_linux_x86_64.inc (original)
+++ compiler-rt/trunk/lib/sanitizer_common/sanitizer_syscall_linux_x86_64.inc Thu Oct  3 11:53:50 2013
@@ -13,7 +13,8 @@
 
 static uptr internal_syscall(u64 nr) {
   u64 retval;
-  asm volatile("syscall" : "=a"(retval) : "a"(nr) : "rcx", "r11");
+  asm volatile("syscall" : "=a"(retval) : "a"(nr) : "rcx", "r11",
+               "memory", "cc");
   return retval;
 }
 
@@ -21,7 +22,7 @@ template <typename T1>
 static uptr internal_syscall(u64 nr, T1 arg1) {
   u64 retval;
   asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1) :
-               "rcx", "r11");
+               "rcx", "r11", "memory", "cc");
   return retval;
 }
 
@@ -29,7 +30,7 @@ template <typename T1, typename T2>
 static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2) {
   u64 retval;
   asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
-               "S"((u64)arg2) : "rcx", "r11");
+               "S"((u64)arg2) : "rcx", "r11", "memory", "cc");
   return retval;
 }
 
@@ -37,7 +38,7 @@ template <typename T1, typename T2, type
 static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3) {
   u64 retval;
   asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
-               "S"((u64)arg2), "d"((u64)arg3) : "rcx", "r11");
+               "S"((u64)arg2), "d"((u64)arg3) : "rcx", "r11", "memory", "cc");
   return retval;
 }
 
@@ -47,7 +48,7 @@ static uptr internal_syscall(u64 nr, T1
   asm volatile("mov %5, %%r10;"
                "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
                "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4) :
-               "rcx", "r11", "r10");
+               "rcx", "r11", "r10", "memory", "cc");
   return retval;
 }
 
@@ -59,7 +60,7 @@ static uptr internal_syscall(u64 nr, T1
                "mov %6, %%r8;"
                "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
                "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4), "r"((u64)arg5) :
-               "rcx", "r11", "r10", "r8");
+               "rcx", "r11", "r10", "r8", "memory", "cc");
   return retval;
 }
 
@@ -73,7 +74,8 @@ static uptr internal_syscall(u64 nr, T1
                "mov %7, %%r9;"
                "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
                "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4), "r"((u64)arg5),
-               "r"((u64)arg6) : "rcx", "r11", "r10", "r8", "r9");
+               "r"((u64)arg6) : "rcx", "r11", "r10", "r8", "r9",
+               "memory", "cc");
   return retval;
 }
 





More information about the llvm-commits mailing list