master
1/* Copyright (C) 2000-2025 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#ifndef _LINUX_SPARC_SYSDEP_H
19#define _LINUX_SPARC_SYSDEP_H 1
20
21#include <sysdeps/unix/sysdep.h>
22#include <sysdeps/unix/sysv/linux/sysdep.h>
23#include <sysdeps/sparc/sysdep.h>
24
25#ifdef __ASSEMBLER__
26
27#define ret retl; nop
28#define ret_NOERRNO retl; nop
29#define ret_ERRVAL retl; nop
30#define r0 %o0
31#define r1 %o1
32#define MOVE(x,y) mov x, y
33
34#else /* __ASSEMBLER__ */
35
36# define VDSO_NAME "LINUX_2.6"
37# define VDSO_HASH 61765110
38
39/* List of system calls which are supported as vsyscalls. */
40# ifdef __arch64__
41# define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime"
42# else
43# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
44# endif
45# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
46
47#undef INTERNAL_SYSCALL
48#define INTERNAL_SYSCALL(name, nr, args...) \
49 internal_syscall##nr(__SYSCALL_STRING, __NR_##name, args)
50
51#undef INTERNAL_SYSCALL_NCS
52#define INTERNAL_SYSCALL_NCS(name, nr, args...) \
53 _internal_syscall##nr(__SYSCALL_STRING, "p", name, args)
54
55#define _internal_syscall0(string,nc,name,dummy...) \
56({ \
57 register long __o0 __asm__ ("o0"); \
58 long int _name = (long int) (name); \
59 __asm __volatile (string : "=r" (__o0) : \
60 [scn] nc (_name) : \
61 __SYSCALL_CLOBBERS); \
62 __o0; \
63})
64#define internal_syscall0(string,name,args...) \
65 _internal_syscall0(string, "i", name, args)
66
67#define _internal_syscall1(string,nc,name,arg1) \
68({ \
69 long int _arg1 = (long int) (arg1); \
70 long int _name = (long int) (name); \
71 register long int __o0 __asm__ ("o0") = _arg1; \
72 __asm __volatile (string : "+r" (__o0) : \
73 [scn] nc (_name) : \
74 __SYSCALL_CLOBBERS); \
75 __o0; \
76})
77#define internal_syscall1(string,name,args...) \
78 _internal_syscall1(string, "i", name, args)
79
80#define _internal_syscall2(string,nc,name,arg1,arg2) \
81({ \
82 long int _arg1 = (long int) (arg1); \
83 long int _arg2 = (long int) (arg2); \
84 long int _name = (long int) (name); \
85 register long int __o0 __asm__ ("o0") = _arg1; \
86 register long int __o1 __asm__ ("o1") = _arg2; \
87 __asm __volatile (string : "+r" (__o0) : \
88 [scn] nc (_name), "r" (__o1) : \
89 __SYSCALL_CLOBBERS); \
90 __o0; \
91})
92#define internal_syscall2(string,name,args...) \
93 _internal_syscall2(string, "i", name, args)
94
95#define _internal_syscall3(string,nc,name,arg1,arg2,arg3) \
96({ \
97 long int _arg1 = (long int) (arg1); \
98 long int _arg2 = (long int) (arg2); \
99 long int _arg3 = (long int) (arg3); \
100 long int _name = (long int) (name); \
101 register long int __o0 __asm__ ("o0") = _arg1; \
102 register long int __o1 __asm__ ("o1") = _arg2; \
103 register long int __o2 __asm__ ("o2") = _arg3; \
104 __asm __volatile (string : "+r" (__o0) : \
105 [scn] nc (_name), "r" (__o1), \
106 "r" (__o2) : \
107 __SYSCALL_CLOBBERS); \
108 __o0; \
109})
110#define internal_syscall3(string,name,args...) \
111 _internal_syscall3(string, "i", name, args)
112
113#define _internal_syscall4(string,nc,name,arg1,arg2,arg3,arg4) \
114({ \
115 long int _arg1 = (long int) (arg1); \
116 long int _arg2 = (long int) (arg2); \
117 long int _arg3 = (long int) (arg3); \
118 long int _arg4 = (long int) (arg4); \
119 long int _name = (long int) (name); \
120 register long int __o0 __asm__ ("o0") = _arg1; \
121 register long int __o1 __asm__ ("o1") = _arg2; \
122 register long int __o2 __asm__ ("o2") = _arg3; \
123 register long int __o3 __asm__ ("o3") = _arg4; \
124 __asm __volatile (string : "+r" (__o0) : \
125 [scn] nc (_name), "r" (__o1), \
126 "r" (__o2), "r" (__o3) : \
127 __SYSCALL_CLOBBERS); \
128 __o0; \
129})
130#define internal_syscall4(string,name,args...) \
131 _internal_syscall4(string, "i", name, args)
132
133#define _internal_syscall5(string,nc,name,arg1,arg2,arg3,arg4,arg5) \
134({ \
135 long int _arg1 = (long int) (arg1); \
136 long int _arg2 = (long int) (arg2); \
137 long int _arg3 = (long int) (arg3); \
138 long int _arg4 = (long int) (arg4); \
139 long int _arg5 = (long int) (arg5); \
140 long int _name = (long int) (name); \
141 register long int __o0 __asm__ ("o0") = _arg1; \
142 register long int __o1 __asm__ ("o1") = _arg2; \
143 register long int __o2 __asm__ ("o2") = _arg3; \
144 register long int __o3 __asm__ ("o3") = _arg4; \
145 register long int __o4 __asm__ ("o4") = _arg5; \
146 __asm __volatile (string : "+r" (__o0) : \
147 [scn] nc (_name), "r" (__o1), \
148 "r" (__o2), "r" (__o3), "r" (__o4) : \
149 __SYSCALL_CLOBBERS); \
150 __o0; \
151})
152#define internal_syscall5(string,name,args...) \
153 _internal_syscall5(string, "i", name, args)
154
155#define _internal_syscall6(string,nc,name,arg1,arg2,arg3,arg4,arg5,arg6)\
156({ \
157 long int _arg1 = (long int) (arg1); \
158 long int _arg2 = (long int) (arg2); \
159 long int _arg3 = (long int) (arg3); \
160 long int _arg4 = (long int) (arg4); \
161 long int _arg5 = (long int) (arg5); \
162 long int _arg6 = (long int) (arg6); \
163 long int _name = (long int) (name); \
164 register long int __o0 __asm__ ("o0") = _arg1; \
165 register long int __o1 __asm__ ("o1") = _arg2; \
166 register long int __o2 __asm__ ("o2") = _arg3; \
167 register long int __o3 __asm__ ("o3") = _arg4; \
168 register long int __o4 __asm__ ("o4") = _arg5; \
169 register long int __o5 __asm__ ("o5") = _arg6; \
170 __asm __volatile (string : "+r" (__o0) : \
171 [scn] nc (_name), "r" (__o1), \
172 "r" (__o2), "r" (__o3), "r" (__o4), \
173 "r" (__o5) : \
174 __SYSCALL_CLOBBERS); \
175 __o0; \
176})
177#define internal_syscall6(string,name,args...) \
178 _internal_syscall6(string, "i", name, args)
179
180#define INLINE_CLONE_SYSCALL(arg1,arg2,arg3,arg4,arg5) \
181({ \
182 long int _arg1 = (long int) (arg1); \
183 long int _arg2 = (long int) (arg2); \
184 long int _arg3 = (long int) (arg3); \
185 long int _arg4 = (long int) (arg4); \
186 long int _arg5 = (long int) (arg5); \
187 long int _name = __NR_clone; \
188 register long int __o0 __asm__ ("o0") = _arg1; \
189 register long int __o1 __asm__ ("o1") = _arg2; \
190 register long int __o2 __asm__ ("o2") = _arg3; \
191 register long int __o3 __asm__ ("o3") = _arg4; \
192 register long int __o4 __asm__ ("o4") = _arg5; \
193 __asm __volatile (__SYSCALL_STRING : \
194 "=r" (__o0), "=r" (__o1) : \
195 [scn] "i" (_name), "0" (__o0), "1" (__o1), \
196 "r" (__o2), "r" (__o3), "r" (__o4) : \
197 __SYSCALL_CLOBBERS); \
198 if (__glibc_unlikely ((unsigned long int) (__o0) > -4096UL)) \
199 { \
200 __set_errno (-__o0); \
201 __o0 = -1L; \
202 } \
203 else \
204 { \
205 __o0 &= (__o1 - 1); \
206 } \
207 __o0; \
208})
209
210#endif /* __ASSEMBLER__ */
211
212#endif /* _LINUX_SPARC_SYSDEP_H */