1 //! 32-bit specific definitions for linux-like values
2 
3 use pthread_mutex_t;
4 
5 pub type c_long = i32;
6 pub type c_ulong = u32;
7 pub type clock_t = i32;
8 
9 pub type shmatt_t = ::c_ulong;
10 pub type msgqnum_t = ::c_ulong;
11 pub type msglen_t = ::c_ulong;
12 pub type nlink_t = u32;
13 pub type __u64 = ::c_ulonglong;
14 pub type __s64 = ::c_longlong;
15 pub type __fsword_t = i32;
16 pub type fsblkcnt64_t = u64;
17 pub type fsfilcnt64_t = u64;
18 pub type __syscall_ulong_t = ::c_ulong;
19 
20 cfg_if! {
21     if #[cfg(target_arch = "riscv32")] {
22         pub type time_t = i64;
23         pub type suseconds_t = i64;
24         pub type ino_t = u64;
25         pub type off_t = i64;
26         pub type blkcnt_t = i64;
27         pub type fsblkcnt_t = u64;
28         pub type fsfilcnt_t = u64;
29         pub type rlim_t = u64;
30         pub type blksize_t = i64;
31     } else {
32         pub type time_t = i32;
33         pub type suseconds_t = i32;
34         pub type ino_t = u32;
35         pub type off_t = i32;
36         pub type blkcnt_t = i32;
37         pub type fsblkcnt_t = ::c_ulong;
38         pub type fsfilcnt_t = ::c_ulong;
39         pub type rlim_t = c_ulong;
40         pub type blksize_t = i32;
41     }
42 }
43 
44 s! {
45     pub struct stat {
46         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
47         pub st_dev: ::dev_t,
48         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
49         pub st_dev: ::c_ulong,
50 
51         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
52         __pad1: ::c_short,
53         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
54         st_pad1: [::c_long; 3],
55         pub st_ino: ::ino_t,
56         pub st_mode: ::mode_t,
57         pub st_nlink: ::nlink_t,
58         pub st_uid: ::uid_t,
59         pub st_gid: ::gid_t,
60         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
61         pub st_rdev: ::dev_t,
62         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
63         pub st_rdev: ::c_ulong,
64         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
65         __pad2: ::c_short,
66         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
67         st_pad2: [::c_long; 2],
68         pub st_size: ::off_t,
69         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
70         st_pad3: ::c_long,
71         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
72         pub st_blksize: ::blksize_t,
73         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
74         pub st_blocks: ::blkcnt_t,
75         pub st_atime: ::time_t,
76         pub st_atime_nsec: ::c_long,
77         pub st_mtime: ::time_t,
78         pub st_mtime_nsec: ::c_long,
79         pub st_ctime: ::time_t,
80         pub st_ctime_nsec: ::c_long,
81         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
82         __unused4: ::c_long,
83         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6")))]
84         __unused5: ::c_long,
85         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
86         pub st_blksize: ::blksize_t,
87         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
88         pub st_blocks: ::blkcnt_t,
89         #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))]
90         st_pad5: [::c_long; 14],
91     }
92 
93     pub struct statvfs {
94         pub f_bsize: ::c_ulong,
95         pub f_frsize: ::c_ulong,
96         pub f_blocks: ::fsblkcnt_t,
97         pub f_bfree: ::fsblkcnt_t,
98         pub f_bavail: ::fsblkcnt_t,
99         pub f_files: ::fsfilcnt_t,
100         pub f_ffree: ::fsfilcnt_t,
101         pub f_favail: ::fsfilcnt_t,
102         pub f_fsid: ::c_ulong,
103         __f_unused: ::c_int,
104         pub f_flag: ::c_ulong,
105         pub f_namemax: ::c_ulong,
106         __f_spare: [::c_int; 6],
107     }
108 
109     pub struct pthread_attr_t {
110         __size: [u32; 9]
111     }
112 
113     pub struct sigset_t {
114         __val: [::c_ulong; 32],
115     }
116 
117     pub struct sysinfo {
118         pub uptime: ::c_long,
119         pub loads: [::c_ulong; 3],
120         pub totalram: ::c_ulong,
121         pub freeram: ::c_ulong,
122         pub sharedram: ::c_ulong,
123         pub bufferram: ::c_ulong,
124         pub totalswap: ::c_ulong,
125         pub freeswap: ::c_ulong,
126         pub procs: ::c_ushort,
127         #[deprecated(
128             since = "0.2.58",
129             note = "This padding field might become private in the future"
130         )]
131         pub pad: ::c_ushort,
132         pub totalhigh: ::c_ulong,
133         pub freehigh: ::c_ulong,
134         pub mem_unit: ::c_uint,
135         pub _f: [::c_char; 8],
136     }
137 
138     pub struct semid_ds {
139         pub sem_perm: ipc_perm,
140         #[cfg(target_arch = "powerpc")]
141         __reserved: ::__syscall_ulong_t,
142         pub sem_otime: ::time_t,
143         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc")))]
144         __reserved: ::__syscall_ulong_t,
145         #[cfg(target_arch = "powerpc")]
146         __reserved2: ::__syscall_ulong_t,
147         pub sem_ctime: ::time_t,
148         #[cfg(not(any(target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc")))]
149         __reserved2: ::__syscall_ulong_t,
150         pub sem_nsems: ::__syscall_ulong_t,
151         __glibc_reserved3: ::__syscall_ulong_t,
152         __glibc_reserved4: ::__syscall_ulong_t,
153     }
154 }
155 
156 pub const POSIX_FADV_DONTNEED: ::c_int = 4;
157 pub const POSIX_FADV_NOREUSE: ::c_int = 5;
158 
159 pub const F_OFD_GETLK: ::c_int = 36;
160 pub const F_OFD_SETLK: ::c_int = 37;
161 pub const F_OFD_SETLKW: ::c_int = 38;
162 
163 pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
164 pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24;
165 pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32;
166 pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20;
167 pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
168 pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8;
169 pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4;
170 
171 cfg_if! {
172     if #[cfg(target_arch = "sparc")] {
173         pub const O_NOATIME: ::c_int = 0x200000;
174         pub const O_PATH: ::c_int = 0x1000000;
175         pub const O_TMPFILE: ::c_int = 0x2000000 | O_DIRECTORY;
176 
177         pub const SA_ONSTACK: ::c_int = 1;
178 
179         pub const PTRACE_DETACH: ::c_uint = 11;
180 
181         pub const F_SETLK: ::c_int = 8;
182         pub const F_SETLKW: ::c_int = 9;
183 
184         pub const F_RDLCK: ::c_int = 1;
185         pub const F_WRLCK: ::c_int = 2;
186         pub const F_UNLCK: ::c_int = 3;
187 
188         pub const SFD_CLOEXEC: ::c_int = 0x400000;
189 
190         pub const NCCS: usize = 17;
191 
192         pub const O_TRUNC: ::c_int = 0x400;
193         pub const O_CLOEXEC: ::c_int = 0x400000;
194 
195         pub const EBFONT: ::c_int = 109;
196         pub const ENOSTR: ::c_int = 72;
197         pub const ENODATA: ::c_int = 111;
198         pub const ETIME: ::c_int = 73;
199         pub const ENOSR: ::c_int = 74;
200         pub const ENONET: ::c_int = 80;
201         pub const ENOPKG: ::c_int = 113;
202         pub const EREMOTE: ::c_int = 71;
203         pub const ENOLINK: ::c_int = 82;
204         pub const EADV: ::c_int = 83;
205         pub const ESRMNT: ::c_int = 84;
206         pub const ECOMM: ::c_int = 85;
207         pub const EPROTO: ::c_int = 86;
208         pub const EDOTDOT: ::c_int = 88;
209 
210         pub const SA_NODEFER: ::c_int = 0x20;
211         pub const SA_RESETHAND: ::c_int = 0x4;
212         pub const SA_RESTART: ::c_int = 0x2;
213         pub const SA_NOCLDSTOP: ::c_int = 0x00000008;
214 
215         pub const EPOLL_CLOEXEC: ::c_int = 0x400000;
216 
217         pub const EFD_CLOEXEC: ::c_int = 0x400000;
218     } else {
219         pub const O_NOATIME: ::c_int = 0o1000000;
220         pub const O_PATH: ::c_int = 0o10000000;
221         pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY;
222 
223         pub const SA_ONSTACK: ::c_int = 0x08000000;
224 
225         pub const PTRACE_DETACH: ::c_uint = 17;
226 
227         pub const F_SETLK: ::c_int = 6;
228         pub const F_SETLKW: ::c_int = 7;
229 
230         pub const F_RDLCK: ::c_int = 0;
231         pub const F_WRLCK: ::c_int = 1;
232         pub const F_UNLCK: ::c_int = 2;
233 
234         pub const SFD_CLOEXEC: ::c_int = 0x080000;
235 
236         pub const NCCS: usize = 32;
237 
238         pub const O_TRUNC: ::c_int = 512;
239         pub const O_CLOEXEC: ::c_int = 0x80000;
240         pub const EBFONT: ::c_int = 59;
241         pub const ENOSTR: ::c_int = 60;
242         pub const ENODATA: ::c_int = 61;
243         pub const ETIME: ::c_int = 62;
244         pub const ENOSR: ::c_int = 63;
245         pub const ENONET: ::c_int = 64;
246         pub const ENOPKG: ::c_int = 65;
247         pub const EREMOTE: ::c_int = 66;
248         pub const ENOLINK: ::c_int = 67;
249         pub const EADV: ::c_int = 68;
250         pub const ESRMNT: ::c_int = 69;
251         pub const ECOMM: ::c_int = 70;
252         pub const EPROTO: ::c_int = 71;
253         pub const EDOTDOT: ::c_int = 73;
254 
255         pub const SA_NODEFER: ::c_int = 0x40000000;
256         pub const SA_RESETHAND: ::c_int = 0x80000000;
257         pub const SA_RESTART: ::c_int = 0x10000000;
258         pub const SA_NOCLDSTOP: ::c_int = 0x00000001;
259 
260         pub const EPOLL_CLOEXEC: ::c_int = 0x80000;
261 
262         pub const EFD_CLOEXEC: ::c_int = 0x80000;
263     }
264 }
265 
266 align_const! {
267     #[cfg(target_endian = "little")]
268     pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t =
269         pthread_mutex_t {
270             size: [
271                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0,
272                 0, 0, 0,
273             ],
274         };
275     #[cfg(target_endian = "little")]
276     pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t =
277         pthread_mutex_t {
278             size: [
279                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0,
280                 0, 0, 0,
281             ],
282         };
283     #[cfg(target_endian = "little")]
284     pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t =
285         pthread_mutex_t {
286             size: [
287                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0,
288                 0, 0, 0,
289             ],
290         };
291     #[cfg(target_endian = "big")]
292     pub const PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t =
293         pthread_mutex_t {
294             size: [
295                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
296                 0, 0, 0,
297             ],
298         };
299     #[cfg(target_endian = "big")]
300     pub const PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP: ::pthread_mutex_t =
301         pthread_mutex_t {
302             size: [
303                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
304                 0, 0, 0,
305             ],
306         };
307     #[cfg(target_endian = "big")]
308     pub const PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP: ::pthread_mutex_t =
309         pthread_mutex_t {
310             size: [
311                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
312                 0, 0, 0,
313             ],
314         };
315 }
316 
317 pub const PTRACE_GETFPREGS: ::c_uint = 14;
318 pub const PTRACE_SETFPREGS: ::c_uint = 15;
319 pub const PTRACE_GETREGS: ::c_uint = 12;
320 pub const PTRACE_SETREGS: ::c_uint = 13;
321 
322 extern "C" {
323     pub fn sysctl(
324         name: *mut ::c_int,
325         namelen: ::c_int,
326         oldp: *mut ::c_void,
327         oldlenp: *mut ::size_t,
328         newp: *mut ::c_void,
329         newlen: ::size_t,
330     ) -> ::c_int;
331 }
332 
333 cfg_if! {
334     if #[cfg(target_arch = "x86")] {
335         mod x86;
336         pub use self::x86::*;
337     } else if #[cfg(target_arch = "arm")] {
338         mod arm;
339         pub use self::arm::*;
340     } else if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] {
341         mod mips;
342         pub use self::mips::*;
343     } else if #[cfg(target_arch = "m68k")] {
344         mod m68k;
345         pub use self::m68k::*;
346     } else if #[cfg(target_arch = "powerpc")] {
347         mod powerpc;
348         pub use self::powerpc::*;
349     } else if #[cfg(target_arch = "sparc")] {
350         mod sparc;
351         pub use self::sparc::*;
352     } else if #[cfg(target_arch = "riscv32")] {
353         mod riscv32;
354         pub use self::riscv32::*;
355     } else if #[cfg(target_arch = "csky")] {
356         mod csky;
357         pub use self::csky::*;
358     } else {
359         // Unknown target_arch
360     }
361 }
362