1 /* Syscall definitions, Linux s390 version. 2 Copyright (C) 2019-2021 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <http://www.gnu.org/licenses/>. */ 18 19 #ifndef __ASSEMBLY__ 20 21 #undef SYS_ify 22 #define SYS_ify(syscall_name) __NR_##syscall_name 23 24 #undef INTERNAL_SYSCALL_DIRECT 25 #define INTERNAL_SYSCALL_DIRECT(name, nr, args...) \ 26 ({ \ 27 DECLARGS_##nr(args) \ 28 register long int _ret __asm__("2"); \ 29 __asm__ __volatile__ ( \ 30 "svc %b1\n\t" \ 31 : "=d" (_ret) \ 32 : "i" (__NR_##name) ASMFMT_##nr \ 33 : "memory" ); \ 34 _ret; }) 35 36 #undef INTERNAL_SYSCALL_SVC0 37 #define INTERNAL_SYSCALL_SVC0(name, nr, args...) \ 38 ({ \ 39 DECLARGS_##nr(args) \ 40 register unsigned long int _nr __asm__("1") = \ 41 (unsigned long int)(__NR_##name); \ 42 register long int _ret __asm__("2"); \ 43 __asm__ __volatile__ ( \ 44 "svc 0\n\t" \ 45 : "=d" (_ret) \ 46 : "d" (_nr) ASMFMT_##nr \ 47 : "memory" ); \ 48 _ret; }) 49 50 #undef INTERNAL_SYSCALL_NCS 51 #define INTERNAL_SYSCALL_NCS(no, nr, args...) \ 52 ({ \ 53 DECLARGS_##nr(args) \ 54 register unsigned long int _nr __asm__("1") = (unsigned long int)(no); \ 55 register long int _ret __asm__("2"); \ 56 __asm__ __volatile__ ( \ 57 "svc 0\n\t" \ 58 : "=d" (_ret) \ 59 : "d" (_nr) ASMFMT_##nr \ 60 : "memory" ); \ 61 _ret; }) 62 63 #undef INTERNAL_SYSCALL 64 #define INTERNAL_SYSCALL(name, nr, args...) \ 65 (((__NR_##name) < 256) \ 66 ? INTERNAL_SYSCALL_DIRECT(name, nr, args) \ 67 : INTERNAL_SYSCALL_SVC0(name, nr, args)) 68 69 #define DECLARGS_0() 70 #define DECLARGS_1(arg1) \ 71 register unsigned long int gpr2 __asm__ ("2") = (unsigned long int)(arg1); 72 #define DECLARGS_2(arg1, arg2) \ 73 DECLARGS_1(arg1) \ 74 register unsigned long int gpr3 __asm__ ("3") = (unsigned long int)(arg2); 75 #define DECLARGS_3(arg1, arg2, arg3) \ 76 DECLARGS_2(arg1, arg2) \ 77 register unsigned long int gpr4 __asm__ ("4") = (unsigned long int)(arg3); 78 #define DECLARGS_4(arg1, arg2, arg3, arg4) \ 79 DECLARGS_3(arg1, arg2, arg3) \ 80 register unsigned long int gpr5 __asm__ ("5") = (unsigned long int)(arg4); 81 #define DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \ 82 DECLARGS_4(arg1, arg2, arg3, arg4) \ 83 register unsigned long int gpr6 __asm__ ("6") = (unsigned long int)(arg5); 84 #define DECLARGS_6(arg1, arg2, arg3, arg4, arg5, arg6) \ 85 DECLARGS_5(arg1, arg2, arg3, arg4, arg5) \ 86 register unsigned long int gpr7 __asm__ ("7") = (unsigned long int)(arg6); 87 88 #define ASMFMT_0 89 #define ASMFMT_1 , "0" (gpr2) 90 #define ASMFMT_2 , "0" (gpr2), "d" (gpr3) 91 #define ASMFMT_3 , "0" (gpr2), "d" (gpr3), "d" (gpr4) 92 #define ASMFMT_4 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5) 93 #define ASMFMT_5 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6) 94 #define ASMFMT_6 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6), "d" (gpr7) 95 96 #define SINGLE_THREAD_BY_GLOBAL 1 97 98 99 #define VDSO_NAME "LINUX_2.6.29" 100 #define VDSO_HASH 123718585 101 102 /* List of system calls which are supported as vsyscalls. */ 103 #ifdef __s390x__ 104 #define HAVE_CLOCK_GETRES64_VSYSCALL "__kernel_clock_getres" 105 #define HAVE_CLOCK_GETTIME64_VSYSCALL "__kernel_clock_gettime" 106 #else 107 #define HAVE_CLOCK_GETRES_VSYSCALL "__kernel_clock_getres" 108 #define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime" 109 #endif 110 #define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" 111 #define HAVE_GETCPU_VSYSCALL "__kernel_getcpu" 112 113 #endif 114