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