sanitizer_syscall_linux_aarch64.inc revision 296417
1251881Speter//===-- sanitizer_syscall_linux_aarch64.inc --------------------*- C++ -*-===// 2251881Speter// 3251881Speter// The LLVM Compiler Infrastructure 4251881Speter// 5251881Speter// This file is distributed under the University of Illinois Open Source 6251881Speter// License. See LICENSE.TXT for details. 7251881Speter// 8251881Speter//===----------------------------------------------------------------------===// 9251881Speter// 10251881Speter// Implementations of internal_syscall and internal_iserror for Linux/aarch64. 11251881Speter// 12251881Speter//===----------------------------------------------------------------------===// 13251881Speter 14251881Speter#define SYSCALL(name) __NR_ ## name 15251881Speter 16251881Speterstatic uptr __internal_syscall(u64 nr) { 17251881Speter register u64 x8 asm("x8") = nr; 18251881Speter register u64 x0 asm("x0"); 19251881Speter asm volatile("svc 0" 20251881Speter : "=r"(x0) 21251881Speter : "r"(x8) 22251881Speter : "memory", "cc"); 23251881Speter return x0; 24251881Speter} 25251881Speter#define __internal_syscall0(n) \ 26251881Speter (__internal_syscall)(n) 27251881Speter 28251881Speterstatic uptr __internal_syscall(u64 nr, u64 arg1) { 29251881Speter register u64 x8 asm("x8") = nr; 30251881Speter register u64 x0 asm("x0") = arg1; 31251881Speter asm volatile("svc 0" 32251881Speter : "=r"(x0) 33251881Speter : "r"(x8), "0"(x0) 34251881Speter : "memory", "cc"); 35251881Speter return x0; 36251881Speter} 37251881Speter#define __internal_syscall1(n, a1) \ 38251881Speter (__internal_syscall)(n, (u64)(a1)) 39251881Speter 40251881Speterstatic uptr __internal_syscall(u64 nr, u64 arg1, long arg2) { 41262253Speter register u64 x8 asm("x8") = nr; 42262253Speter register u64 x0 asm("x0") = arg1; 43262253Speter register u64 x1 asm("x1") = arg2; 44251881Speter asm volatile("svc 0" 45251881Speter : "=r"(x0) 46251881Speter : "r"(x8), "0"(x0), "r"(x1) 47251881Speter : "memory", "cc"); 48251881Speter return x0; 49251881Speter} 50251881Speter#define __internal_syscall2(n, a1, a2) \ 51251881Speter (__internal_syscall)(n, (u64)(a1), (long)(a2)) 52251881Speter 53251881Speterstatic uptr __internal_syscall(u64 nr, u64 arg1, long arg2, long arg3) { 54251881Speter register u64 x8 asm("x8") = nr; 55251881Speter register u64 x0 asm("x0") = arg1; 56251881Speter register u64 x1 asm("x1") = arg2; 57251881Speter register u64 x2 asm("x2") = arg3; 58251881Speter asm volatile("svc 0" 59251881Speter : "=r"(x0) 60251881Speter : "r"(x8), "0"(x0), "r"(x1), "r"(x2) 61251881Speter : "memory", "cc"); 62262253Speter return x0; 63262253Speter} 64262253Speter#define __internal_syscall3(n, a1, a2, a3) \ 65251881Speter (__internal_syscall)(n, (u64)(a1), (long)(a2), (long)(a3)) 66251881Speter 67251881Speterstatic uptr __internal_syscall(u64 nr, u64 arg1, long arg2, long arg3, 68251881Speter u64 arg4) { 69251881Speter register u64 x8 asm("x8") = nr; 70251881Speter register u64 x0 asm("x0") = arg1; 71251881Speter register u64 x1 asm("x1") = arg2; 72251881Speter register u64 x2 asm("x2") = arg3; 73251881Speter register u64 x3 asm("x3") = arg4; 74251881Speter asm volatile("svc 0" 75251881Speter : "=r"(x0) 76251881Speter : "r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3) 77251881Speter : "memory", "cc"); 78251881Speter return x0; 79251881Speter} 80251881Speter#define __internal_syscall4(n, a1, a2, a3, a4) \ 81251881Speter (__internal_syscall)(n, (u64)(a1), (long)(a2), (long)(a3), (long)(a4)) 82251881Speter 83251881Speterstatic uptr __internal_syscall(u64 nr, u64 arg1, long arg2, long arg3, 84251881Speter u64 arg4, long arg5) { 85251881Speter register u64 x8 asm("x8") = nr; 86251881Speter register u64 x0 asm("x0") = arg1; 87251881Speter register u64 x1 asm("x1") = arg2; 88251881Speter register u64 x2 asm("x2") = arg3; 89251881Speter register u64 x3 asm("x3") = arg4; 90251881Speter register u64 x4 asm("x4") = arg5; 91251881Speter asm volatile("svc 0" 92251881Speter : "=r"(x0) 93251881Speter : "r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4) 94251881Speter : "memory", "cc"); 95251881Speter return x0; 96251881Speter} 97251881Speter#define __internal_syscall5(n, a1, a2, a3, a4, a5) \ 98251881Speter (__internal_syscall)(n, (u64)(a1), (long)(a2), (long)(a3), (long)(a4), \ 99251881Speter (u64)(a5)) 100251881Speter 101251881Speterstatic uptr __internal_syscall(u64 nr, u64 arg1, long arg2, long arg3, 102251881Speter u64 arg4, long arg5, long arg6) { 103251881Speter register u64 x8 asm("x8") = nr; 104251881Speter register u64 x0 asm("x0") = arg1; 105251881Speter register u64 x1 asm("x1") = arg2; 106251881Speter register u64 x2 asm("x2") = arg3; 107251881Speter register u64 x3 asm("x3") = arg4; 108251881Speter register u64 x4 asm("x4") = arg5; 109251881Speter register u64 x5 asm("x5") = arg6; 110251881Speter asm volatile("svc 0" 111251881Speter : "=r"(x0) 112251881Speter : "r"(x8), "0"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5) 113251881Speter : "memory", "cc"); 114251881Speter return x0; 115251881Speter} 116251881Speter#define __internal_syscall6(n, a1, a2, a3, a4, a5, a6) \ 117251881Speter (__internal_syscall)(n, (u64)(a1), (long)(a2), (long)(a3), (long)(a4), \ 118251881Speter (u64)(a5), (long)(a6)) 119251881Speter 120251881Speter#define __SYSCALL_NARGS_X(a1, a2, a3, a4, a5, a6, a7, a8, n, ...) n 121251881Speter#define __SYSCALL_NARGS(...) \ 122251881Speter __SYSCALL_NARGS_X(__VA_ARGS__, 7, 6, 5, 4, 3, 2, 1, 0, ) 123251881Speter#define __SYSCALL_CONCAT_X(a, b) a##b 124251881Speter#define __SYSCALL_CONCAT(a, b) __SYSCALL_CONCAT_X(a, b) 125251881Speter#define __SYSCALL_DISP(b, ...) \ 126251881Speter __SYSCALL_CONCAT(b, __SYSCALL_NARGS(__VA_ARGS__))(__VA_ARGS__) 127251881Speter 128251881Speter#define internal_syscall(...) __SYSCALL_DISP(__internal_syscall, __VA_ARGS__) 129251881Speter 130251881Speter// Helper function used to avoid cobbler errno. 131251881Speterbool internal_iserror(uptr retval, int *rverrno) { 132251881Speter if (retval >= (uptr)-4095) { 133251881Speter if (rverrno) 134289166Speter *rverrno = -retval; 135289166Speter return true; 136289166Speter } 137289166Speter return false; 138289166Speter} 139289166Speter