xref: /llvm-project/libc/src/__support/OSUtil/linux/arm/syscall.h (revision 5ff3ff33ff930e4ec49da7910612d8a41eb068cb)
14c810ecbSSiva Chandra Reddy //===--------- inline implementation of arm syscalls --------------* C++ *-===//
24c810ecbSSiva Chandra Reddy //
34c810ecbSSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44c810ecbSSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
54c810ecbSSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64c810ecbSSiva Chandra Reddy //
74c810ecbSSiva Chandra Reddy //===----------------------------------------------------------------------===//
84c810ecbSSiva Chandra Reddy 
9270547f3SGuillaume Chatelet #ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_SYSCALL_H
10270547f3SGuillaume Chatelet #define LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_SYSCALL_H
114c810ecbSSiva Chandra Reddy 
124c810ecbSSiva Chandra Reddy #include "src/__support/common.h"
13*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h"
144c810ecbSSiva Chandra Reddy 
154c810ecbSSiva Chandra Reddy #ifdef __thumb__
164c87212dSNick Desaulniers (paternity leave) #define R7 long r7 = number
174c87212dSNick Desaulniers (paternity leave) #define SYSCALL_INSTR(input_constraint)                                        \
184c87212dSNick Desaulniers (paternity leave)   int temp;                                                                    \
194c87212dSNick Desaulniers (paternity leave)   LIBC_INLINE_ASM(R"(
204c87212dSNick Desaulniers (paternity leave)     mov %[temp], r7
214c87212dSNick Desaulniers (paternity leave)     mov r7, %2
224c87212dSNick Desaulniers (paternity leave)     svc #0
234c87212dSNick Desaulniers (paternity leave)     mov r7, %[temp]
244c87212dSNick Desaulniers (paternity leave)   )"                                                          \
254c87212dSNick Desaulniers (paternity leave)                   : "=r"(r0), [temp] "=&r"(temp)                               \
264c87212dSNick Desaulniers (paternity leave)                   : input_constraint                                           \
274c87212dSNick Desaulniers (paternity leave)                   : "memory", "cc")
284c87212dSNick Desaulniers (paternity leave) #else
294c87212dSNick Desaulniers (paternity leave) #define R7 register long r7 asm("r7") = number
304c87212dSNick Desaulniers (paternity leave) #define SYSCALL_INSTR(input_constraint)                                        \
314c87212dSNick Desaulniers (paternity leave)   LIBC_INLINE_ASM("svc 0" : "=r"(r0) : input_constraint : "memory", "cc")
324c87212dSNick Desaulniers (paternity leave) #endif
334c810ecbSSiva Chandra Reddy 
344c810ecbSSiva Chandra Reddy #define REGISTER_DECL_0                                                        \
354c87212dSNick Desaulniers (paternity leave)   R7;                                                                          \
364c810ecbSSiva Chandra Reddy   register long r0 __asm__("r0");
374c810ecbSSiva Chandra Reddy #define REGISTER_DECL_1                                                        \
384c87212dSNick Desaulniers (paternity leave)   R7;                                                                          \
394c810ecbSSiva Chandra Reddy   register long r0 __asm__("r0") = arg1;
404c810ecbSSiva Chandra Reddy #define REGISTER_DECL_2                                                        \
414c810ecbSSiva Chandra Reddy   REGISTER_DECL_1                                                              \
424c810ecbSSiva Chandra Reddy   register long r1 __asm__("r1") = arg2;
434c810ecbSSiva Chandra Reddy #define REGISTER_DECL_3                                                        \
444c810ecbSSiva Chandra Reddy   REGISTER_DECL_2                                                              \
454c810ecbSSiva Chandra Reddy   register long r2 __asm__("r2") = arg3;
464c810ecbSSiva Chandra Reddy #define REGISTER_DECL_4                                                        \
474c810ecbSSiva Chandra Reddy   REGISTER_DECL_3                                                              \
484c810ecbSSiva Chandra Reddy   register long r3 __asm__("r3") = arg4;
494c810ecbSSiva Chandra Reddy #define REGISTER_DECL_5                                                        \
504c810ecbSSiva Chandra Reddy   REGISTER_DECL_4                                                              \
514c810ecbSSiva Chandra Reddy   register long r4 __asm__("r4") = arg5;
524c810ecbSSiva Chandra Reddy #define REGISTER_DECL_6                                                        \
534c810ecbSSiva Chandra Reddy   REGISTER_DECL_5                                                              \
544c810ecbSSiva Chandra Reddy   register long r5 __asm__("r5") = arg6;
554c810ecbSSiva Chandra Reddy 
564c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_0 "r"(r7)
574c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_1 REGISTER_CONSTRAINT_0, "r"(r0)
584c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_2 REGISTER_CONSTRAINT_1, "r"(r1)
594c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_3 REGISTER_CONSTRAINT_2, "r"(r2)
604c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_4 REGISTER_CONSTRAINT_3, "r"(r3)
614c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_5 REGISTER_CONSTRAINT_4, "r"(r4)
624c810ecbSSiva Chandra Reddy #define REGISTER_CONSTRAINT_6 REGISTER_CONSTRAINT_5, "r"(r5)
634c810ecbSSiva Chandra Reddy 
64*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL {
654c810ecbSSiva Chandra Reddy 
6605d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number) {
674c810ecbSSiva Chandra Reddy   REGISTER_DECL_0;
684c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_0);
694c810ecbSSiva Chandra Reddy   return r0;
704c810ecbSSiva Chandra Reddy }
714c810ecbSSiva Chandra Reddy 
7205d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number, long arg1) {
734c810ecbSSiva Chandra Reddy   REGISTER_DECL_1;
744c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_1);
754c810ecbSSiva Chandra Reddy   return r0;
764c810ecbSSiva Chandra Reddy }
774c810ecbSSiva Chandra Reddy 
7805d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number, long arg1, long arg2) {
794c810ecbSSiva Chandra Reddy   REGISTER_DECL_2;
804c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_2);
814c810ecbSSiva Chandra Reddy   return r0;
824c810ecbSSiva Chandra Reddy }
834c810ecbSSiva Chandra Reddy 
8405d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3) {
854c810ecbSSiva Chandra Reddy   REGISTER_DECL_3;
864c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_3);
874c810ecbSSiva Chandra Reddy   return r0;
884c810ecbSSiva Chandra Reddy }
894c810ecbSSiva Chandra Reddy 
9005d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
9105d9cc47SSiva Chandra Reddy                               long arg4) {
924c810ecbSSiva Chandra Reddy   REGISTER_DECL_4;
934c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_4);
944c810ecbSSiva Chandra Reddy   return r0;
954c810ecbSSiva Chandra Reddy }
964c810ecbSSiva Chandra Reddy 
9705d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
981801c356SMichael Jones                               long arg4, long arg5) {
994c810ecbSSiva Chandra Reddy   REGISTER_DECL_5;
1004c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_5);
1014c810ecbSSiva Chandra Reddy   return r0;
1024c810ecbSSiva Chandra Reddy }
1034c810ecbSSiva Chandra Reddy 
10405d9cc47SSiva Chandra Reddy LIBC_INLINE long syscall_impl(long number, long arg1, long arg2, long arg3,
10505d9cc47SSiva Chandra Reddy                               long arg4, long arg5, long arg6) {
1064c810ecbSSiva Chandra Reddy   REGISTER_DECL_6;
1074c810ecbSSiva Chandra Reddy   SYSCALL_INSTR(REGISTER_CONSTRAINT_6);
1084c810ecbSSiva Chandra Reddy   return r0;
1094c810ecbSSiva Chandra Reddy }
1104c810ecbSSiva Chandra Reddy 
111*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL
1124c810ecbSSiva Chandra Reddy 
1134c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_0
1144c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_1
1154c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_2
1164c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_3
1174c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_4
1184c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_5
1194c810ecbSSiva Chandra Reddy #undef REGISTER_DECL_6
1204c810ecbSSiva Chandra Reddy 
1214c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_0
1224c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_1
1234c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_2
1244c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_3
1254c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_4
1264c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_5
1274c810ecbSSiva Chandra Reddy #undef REGISTER_CONSTRAINT_6
1284c810ecbSSiva Chandra Reddy 
129270547f3SGuillaume Chatelet #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_LINUX_ARM_SYSCALL_H
130