1//===-- sanitizer_syscall_linux_x86_64.inc ----------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Implementations of internal_syscall and internal_iserror for Linux/x86_64. 11// 12//===----------------------------------------------------------------------===// 13 14static uptr internal_syscall(u64 nr) { 15 u64 retval; 16 asm volatile("syscall" : "=a"(retval) : "a"(nr) : "rcx", "r11"); 17 return retval; 18} 19 20template <typename T1> 21static uptr internal_syscall(u64 nr, T1 arg1) { 22 u64 retval; 23 asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1) : 24 "rcx", "r11"); 25 return retval; 26} 27 28template <typename T1, typename T2> 29static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2) { 30 u64 retval; 31 asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1), 32 "S"((u64)arg2) : "rcx", "r11"); 33 return retval; 34} 35 36template <typename T1, typename T2, typename T3> 37static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3) { 38 u64 retval; 39 asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1), 40 "S"((u64)arg2), "d"((u64)arg3) : "rcx", "r11"); 41 return retval; 42} 43 44template <typename T1, typename T2, typename T3, typename T4> 45static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3, T4 arg4) { 46 u64 retval; 47 asm volatile("mov %5, %%r10;" 48 "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1), 49 "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4) : 50 "rcx", "r11", "r10"); 51 return retval; 52} 53 54template <typename T1, typename T2, typename T3, typename T4, typename T5> 55static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3, T4 arg4, 56 T5 arg5) { 57 u64 retval; 58 asm volatile("mov %5, %%r10;" 59 "mov %6, %%r8;" 60 "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1), 61 "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4), "r"((u64)arg5) : 62 "rcx", "r11", "r10", "r8"); 63 return retval; 64} 65 66template <typename T1, typename T2, typename T3, typename T4, typename T5, 67 typename T6> 68static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3, T4 arg4, 69 T5 arg5, T6 arg6) { 70 u64 retval; 71 asm volatile("mov %5, %%r10;" 72 "mov %6, %%r8;" 73 "mov %7, %%r9;" 74 "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1), 75 "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4), "r"((u64)arg5), 76 "r"((u64)arg6) : "rcx", "r11", "r10", "r8", "r9"); 77 return retval; 78} 79 80bool internal_iserror(uptr retval, int *rverrno) { 81 if (retval >= (uptr)-4095) { 82 if (rverrno) 83 *rverrno = -retval; 84 return true; 85 } 86 return false; 87} 88