1570af302Sopenharmony_ci#define __SYSCALL_LL_E(x) \
2570af302Sopenharmony_ci((union { long long ll; long l[2]; }){ .ll = x }).l[0], \
3570af302Sopenharmony_ci((union { long long ll; long l[2]; }){ .ll = x }).l[1]
4570af302Sopenharmony_ci#define __SYSCALL_LL_O(x) 0, __SYSCALL_LL_E((x))
5570af302Sopenharmony_ci
6570af302Sopenharmony_ci#ifdef __thumb__
7570af302Sopenharmony_ci
8570af302Sopenharmony_ci/* Avoid use of r7 in asm constraints when producing thumb code,
9570af302Sopenharmony_ci * since it's reserved as frame pointer and might not be supported. */
10570af302Sopenharmony_ci#define __ASM____R7__
11570af302Sopenharmony_ci#define __asm_syscall(...) do { \
12570af302Sopenharmony_ci	__asm__ __volatile__ ( "mov %1,r7 ; mov r7,%2 ; svc 0 ; mov r7,%1" \
13570af302Sopenharmony_ci	: "=r"(r0), "=&r"((int){0}) : __VA_ARGS__ : "memory"); \
14570af302Sopenharmony_ci	return r0; \
15570af302Sopenharmony_ci	} while (0)
16570af302Sopenharmony_ci
17570af302Sopenharmony_ci#else
18570af302Sopenharmony_ci
19570af302Sopenharmony_ci#define __ASM____R7__ __asm__("r7")
20570af302Sopenharmony_ci#define __asm_syscall(...) do { \
21570af302Sopenharmony_ci	__asm__ __volatile__ ( "svc 0" \
22570af302Sopenharmony_ci	: "=r"(r0) : __VA_ARGS__ : "memory"); \
23570af302Sopenharmony_ci	return r0; \
24570af302Sopenharmony_ci	} while (0)
25570af302Sopenharmony_ci#endif
26570af302Sopenharmony_ci
27570af302Sopenharmony_ci/* For thumb2, we can allow 8-bit immediate syscall numbers, saving a
28570af302Sopenharmony_ci * register in the above dance around r7. Does not work for thumb1 where
29570af302Sopenharmony_ci * only movs, not mov, supports immediates, and we can't use movs because
30570af302Sopenharmony_ci * it doesn't support high regs. */
31570af302Sopenharmony_ci#ifdef __thumb2__
32570af302Sopenharmony_ci#define R7_OPERAND "rI"(r7)
33570af302Sopenharmony_ci#else
34570af302Sopenharmony_ci#define R7_OPERAND "r"(r7)
35570af302Sopenharmony_ci#endif
36570af302Sopenharmony_ci
37570af302Sopenharmony_cistatic inline long __syscall0(long n)
38570af302Sopenharmony_ci{
39570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
40570af302Sopenharmony_ci	register long r0 __asm__("r0");
41570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND);
42570af302Sopenharmony_ci}
43570af302Sopenharmony_ci
44570af302Sopenharmony_cistatic inline long __syscall1(long n, long a)
45570af302Sopenharmony_ci{
46570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
47570af302Sopenharmony_ci	register long r0 __asm__("r0") = a;
48570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND, "0"(r0));
49570af302Sopenharmony_ci}
50570af302Sopenharmony_ci
51570af302Sopenharmony_cistatic inline long __syscall2(long n, long a, long b)
52570af302Sopenharmony_ci{
53570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
54570af302Sopenharmony_ci	register long r0 __asm__("r0") = a;
55570af302Sopenharmony_ci	register long r1 __asm__("r1") = b;
56570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND, "0"(r0), "r"(r1));
57570af302Sopenharmony_ci}
58570af302Sopenharmony_ci
59570af302Sopenharmony_cistatic inline long __syscall3(long n, long a, long b, long c)
60570af302Sopenharmony_ci{
61570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
62570af302Sopenharmony_ci	register long r0 __asm__("r0") = a;
63570af302Sopenharmony_ci	register long r1 __asm__("r1") = b;
64570af302Sopenharmony_ci	register long r2 __asm__("r2") = c;
65570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2));
66570af302Sopenharmony_ci}
67570af302Sopenharmony_ci
68570af302Sopenharmony_cistatic inline long __syscall4(long n, long a, long b, long c, long d)
69570af302Sopenharmony_ci{
70570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
71570af302Sopenharmony_ci	register long r0 __asm__("r0") = a;
72570af302Sopenharmony_ci	register long r1 __asm__("r1") = b;
73570af302Sopenharmony_ci	register long r2 __asm__("r2") = c;
74570af302Sopenharmony_ci	register long r3 __asm__("r3") = d;
75570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3));
76570af302Sopenharmony_ci}
77570af302Sopenharmony_ci
78570af302Sopenharmony_cistatic inline long __syscall5(long n, long a, long b, long c, long d, long e)
79570af302Sopenharmony_ci{
80570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
81570af302Sopenharmony_ci	register long r0 __asm__("r0") = a;
82570af302Sopenharmony_ci	register long r1 __asm__("r1") = b;
83570af302Sopenharmony_ci	register long r2 __asm__("r2") = c;
84570af302Sopenharmony_ci	register long r3 __asm__("r3") = d;
85570af302Sopenharmony_ci	register long r4 __asm__("r4") = e;
86570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4));
87570af302Sopenharmony_ci}
88570af302Sopenharmony_ci
89570af302Sopenharmony_cistatic inline long __syscall6(long n, long a, long b, long c, long d, long e, long f)
90570af302Sopenharmony_ci{
91570af302Sopenharmony_ci	register long r7 __ASM____R7__ = n;
92570af302Sopenharmony_ci	register long r0 __asm__("r0") = a;
93570af302Sopenharmony_ci	register long r1 __asm__("r1") = b;
94570af302Sopenharmony_ci	register long r2 __asm__("r2") = c;
95570af302Sopenharmony_ci	register long r3 __asm__("r3") = d;
96570af302Sopenharmony_ci	register long r4 __asm__("r4") = e;
97570af302Sopenharmony_ci	register long r5 __asm__("r5") = f;
98570af302Sopenharmony_ci	__asm_syscall(R7_OPERAND, "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r5));
99570af302Sopenharmony_ci}
100570af302Sopenharmony_ci
101570af302Sopenharmony_ci#define VDSO_USEFUL
102570af302Sopenharmony_ci#ifdef __LITEOS__
103570af302Sopenharmony_ci#define VDSO_CGT32_SYM "VdsoClockGettime"
104570af302Sopenharmony_ci#define VDSO_CGT32_VER "OHOS"
105570af302Sopenharmony_ci#define VDSO_CGT_SYM "VdsoClockGettime"
106570af302Sopenharmony_ci#define VDSO_CGT_VER "OHOS"
107570af302Sopenharmony_ci#else
108570af302Sopenharmony_ci#define VDSO_CGT32_SYM "__vdso_clock_gettime"
109570af302Sopenharmony_ci#define VDSO_CGT32_VER "LINUX_2.6"
110570af302Sopenharmony_ci#define VDSO_CGT_SYM "__vdso_clock_gettime64"
111570af302Sopenharmony_ci#define VDSO_CGT_VER "LINUX_2.6"
112570af302Sopenharmony_ci#endif
113570af302Sopenharmony_ci#define SYSCALL_FADVISE_6_ARG
114570af302Sopenharmony_ci
115570af302Sopenharmony_ci#define SYSCALL_IPC_BROKEN_MODE
116570af302Sopenharmony_ci
117570af302Sopenharmony_ci#define VDSO_CGT_WORKAROUND 1
118