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