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