1 //! x86_64-specific definitions for 64-bit linux-like values
2 
3 use crate::prelude::*;
4 use crate::{off64_t, off_t};
5 
6 pub type wchar_t = i32;
7 pub type nlink_t = u64;
8 pub type blksize_t = i64;
9 pub type greg_t = i64;
10 pub type suseconds_t = i64;
11 pub type __u64 = c_ulonglong;
12 pub type __s64 = c_longlong;
13 
14 s! {
15     // FIXME(1.0): This should not implement `PartialEq`
16     #[allow(unpredictable_function_pointer_comparisons)]
17     pub struct sigaction {
18         pub sa_sigaction: crate::sighandler_t,
19         pub sa_mask: crate::sigset_t,
20         #[cfg(target_arch = "sparc64")]
21         __reserved0: c_int,
22         pub sa_flags: c_int,
23         pub sa_restorer: Option<extern "C" fn()>,
24     }
25 
26     pub struct statfs {
27         pub f_type: crate::__fsword_t,
28         pub f_bsize: crate::__fsword_t,
29         pub f_blocks: crate::fsblkcnt_t,
30         pub f_bfree: crate::fsblkcnt_t,
31         pub f_bavail: crate::fsblkcnt_t,
32 
33         pub f_files: crate::fsfilcnt_t,
34         pub f_ffree: crate::fsfilcnt_t,
35         pub f_fsid: crate::fsid_t,
36 
37         pub f_namelen: crate::__fsword_t,
38         pub f_frsize: crate::__fsword_t,
39         f_spare: [crate::__fsword_t; 5],
40     }
41 
42     pub struct flock {
43         pub l_type: c_short,
44         pub l_whence: c_short,
45         pub l_start: off_t,
46         pub l_len: off_t,
47         pub l_pid: crate::pid_t,
48     }
49 
50     pub struct flock64 {
51         pub l_type: c_short,
52         pub l_whence: c_short,
53         pub l_start: off64_t,
54         pub l_len: off64_t,
55         pub l_pid: crate::pid_t,
56     }
57 
58     pub struct siginfo_t {
59         pub si_signo: c_int,
60         pub si_errno: c_int,
61         pub si_code: c_int,
62         #[doc(hidden)]
63         #[deprecated(
64             since = "0.2.54",
65             note = "Please leave a comment on \
66                   https://github.com/rust-lang/libc/pull/1316 if you're using \
67                   this field"
68         )]
69         pub _pad: [c_int; 29],
70         _align: [u64; 0],
71     }
72 
73     pub struct stack_t {
74         pub ss_sp: *mut c_void,
75         pub ss_flags: c_int,
76         pub ss_size: size_t,
77     }
78 
79     pub struct stat {
80         pub st_dev: crate::dev_t,
81         pub st_ino: crate::ino_t,
82         pub st_nlink: crate::nlink_t,
83         pub st_mode: crate::mode_t,
84         pub st_uid: crate::uid_t,
85         pub st_gid: crate::gid_t,
86         __pad0: c_int,
87         pub st_rdev: crate::dev_t,
88         pub st_size: off_t,
89         pub st_blksize: crate::blksize_t,
90         pub st_blocks: crate::blkcnt_t,
91         pub st_atime: crate::time_t,
92         pub st_atime_nsec: i64,
93         pub st_mtime: crate::time_t,
94         pub st_mtime_nsec: i64,
95         pub st_ctime: crate::time_t,
96         pub st_ctime_nsec: i64,
97         __unused: [i64; 3],
98     }
99 
100     pub struct stat64 {
101         pub st_dev: crate::dev_t,
102         pub st_ino: crate::ino64_t,
103         pub st_nlink: crate::nlink_t,
104         pub st_mode: crate::mode_t,
105         pub st_uid: crate::uid_t,
106         pub st_gid: crate::gid_t,
107         __pad0: c_int,
108         pub st_rdev: crate::dev_t,
109         pub st_size: off_t,
110         pub st_blksize: crate::blksize_t,
111         pub st_blocks: crate::blkcnt64_t,
112         pub st_atime: crate::time_t,
113         pub st_atime_nsec: i64,
114         pub st_mtime: crate::time_t,
115         pub st_mtime_nsec: i64,
116         pub st_ctime: crate::time_t,
117         pub st_ctime_nsec: i64,
118         __reserved: [i64; 3],
119     }
120 
121     pub struct statfs64 {
122         pub f_type: crate::__fsword_t,
123         pub f_bsize: crate::__fsword_t,
124         pub f_blocks: u64,
125         pub f_bfree: u64,
126         pub f_bavail: u64,
127         pub f_files: u64,
128         pub f_ffree: u64,
129         pub f_fsid: crate::fsid_t,
130         pub f_namelen: crate::__fsword_t,
131         pub f_frsize: crate::__fsword_t,
132         pub f_flags: crate::__fsword_t,
133         pub f_spare: [crate::__fsword_t; 4],
134     }
135 
136     pub struct statvfs64 {
137         pub f_bsize: c_ulong,
138         pub f_frsize: c_ulong,
139         pub f_blocks: u64,
140         pub f_bfree: u64,
141         pub f_bavail: u64,
142         pub f_files: u64,
143         pub f_ffree: u64,
144         pub f_favail: u64,
145         pub f_fsid: c_ulong,
146         pub f_flag: c_ulong,
147         pub f_namemax: c_ulong,
148         __f_spare: [c_int; 6],
149     }
150 
151     pub struct pthread_attr_t {
152         #[cfg(target_pointer_width = "32")]
153         __size: [u32; 8],
154         #[cfg(target_pointer_width = "64")]
155         __size: [u64; 7],
156     }
157 
158     pub struct _libc_fpxreg {
159         pub significand: [u16; 4],
160         pub exponent: u16,
161         __private: [u16; 3],
162     }
163 
164     pub struct _libc_xmmreg {
165         pub element: [u32; 4],
166     }
167 
168     pub struct _libc_fpstate {
169         pub cwd: u16,
170         pub swd: u16,
171         pub ftw: u16,
172         pub fop: u16,
173         pub rip: u64,
174         pub rdp: u64,
175         pub mxcsr: u32,
176         pub mxcr_mask: u32,
177         pub _st: [_libc_fpxreg; 8],
178         pub _xmm: [_libc_xmmreg; 16],
179         __private: [u64; 12],
180     }
181 
182     pub struct user_regs_struct {
183         pub r15: c_ulonglong,
184         pub r14: c_ulonglong,
185         pub r13: c_ulonglong,
186         pub r12: c_ulonglong,
187         pub rbp: c_ulonglong,
188         pub rbx: c_ulonglong,
189         pub r11: c_ulonglong,
190         pub r10: c_ulonglong,
191         pub r9: c_ulonglong,
192         pub r8: c_ulonglong,
193         pub rax: c_ulonglong,
194         pub rcx: c_ulonglong,
195         pub rdx: c_ulonglong,
196         pub rsi: c_ulonglong,
197         pub rdi: c_ulonglong,
198         pub orig_rax: c_ulonglong,
199         pub rip: c_ulonglong,
200         pub cs: c_ulonglong,
201         pub eflags: c_ulonglong,
202         pub rsp: c_ulonglong,
203         pub ss: c_ulonglong,
204         pub fs_base: c_ulonglong,
205         pub gs_base: c_ulonglong,
206         pub ds: c_ulonglong,
207         pub es: c_ulonglong,
208         pub fs: c_ulonglong,
209         pub gs: c_ulonglong,
210     }
211 
212     pub struct user {
213         pub regs: user_regs_struct,
214         pub u_fpvalid: c_int,
215         pub i387: user_fpregs_struct,
216         pub u_tsize: c_ulonglong,
217         pub u_dsize: c_ulonglong,
218         pub u_ssize: c_ulonglong,
219         pub start_code: c_ulonglong,
220         pub start_stack: c_ulonglong,
221         pub signal: c_longlong,
222         __reserved: c_int,
223         #[cfg(target_pointer_width = "32")]
224         __pad1: u32,
225         pub u_ar0: *mut user_regs_struct,
226         #[cfg(target_pointer_width = "32")]
227         __pad2: u32,
228         pub u_fpstate: *mut user_fpregs_struct,
229         pub magic: c_ulonglong,
230         pub u_comm: [c_char; 32],
231         pub u_debugreg: [c_ulonglong; 8],
232     }
233 
234     pub struct mcontext_t {
235         pub gregs: [greg_t; 23],
236         pub fpregs: *mut _libc_fpstate,
237         __private: [u64; 8],
238     }
239 
240     pub struct ipc_perm {
241         pub __key: crate::key_t,
242         pub uid: crate::uid_t,
243         pub gid: crate::gid_t,
244         pub cuid: crate::uid_t,
245         pub cgid: crate::gid_t,
246         pub mode: c_ushort,
247         __pad1: c_ushort,
248         pub __seq: c_ushort,
249         __pad2: c_ushort,
250         __unused1: u64,
251         __unused2: u64,
252     }
253 
254     pub struct shmid_ds {
255         pub shm_perm: crate::ipc_perm,
256         pub shm_segsz: size_t,
257         pub shm_atime: crate::time_t,
258         pub shm_dtime: crate::time_t,
259         pub shm_ctime: crate::time_t,
260         pub shm_cpid: crate::pid_t,
261         pub shm_lpid: crate::pid_t,
262         pub shm_nattch: crate::shmatt_t,
263         __unused4: u64,
264         __unused5: u64,
265     }
266 
267     pub struct ptrace_rseq_configuration {
268         pub rseq_abi_pointer: crate::__u64,
269         pub rseq_abi_size: crate::__u32,
270         pub signature: crate::__u32,
271         pub flags: crate::__u32,
272         pub pad: crate::__u32,
273     }
274 
275     #[repr(align(8))]
276     pub struct clone_args {
277         pub flags: c_ulonglong,
278         pub pidfd: c_ulonglong,
279         pub child_tid: c_ulonglong,
280         pub parent_tid: c_ulonglong,
281         pub exit_signal: c_ulonglong,
282         pub stack: c_ulonglong,
283         pub stack_size: c_ulonglong,
284         pub tls: c_ulonglong,
285         pub set_tid: c_ulonglong,
286         pub set_tid_size: c_ulonglong,
287         pub cgroup: c_ulonglong,
288     }
289 }
290 
291 s_no_extra_traits! {
292     pub struct user_fpregs_struct {
293         pub cwd: c_ushort,
294         pub swd: c_ushort,
295         pub ftw: c_ushort,
296         pub fop: c_ushort,
297         pub rip: c_ulonglong,
298         pub rdp: c_ulonglong,
299         pub mxcsr: c_uint,
300         pub mxcr_mask: c_uint,
301         pub st_space: [c_uint; 32],
302         pub xmm_space: [c_uint; 64],
303         padding: [c_uint; 24],
304     }
305 
306     pub struct ucontext_t {
307         pub uc_flags: c_ulong,
308         pub uc_link: *mut ucontext_t,
309         pub uc_stack: crate::stack_t,
310         pub uc_mcontext: mcontext_t,
311         pub uc_sigmask: crate::sigset_t,
312         __private: [u8; 512],
313         // FIXME(glibc): the shadow stack field requires glibc >= 2.28.
314         // Re-add once we drop compatibility with glibc versions older than
315         // 2.28.
316         //
317         // __ssp: [c_ulonglong; 4],
318     }
319 
320     #[allow(missing_debug_implementations)]
321     #[repr(align(16))]
322     pub struct max_align_t {
323         priv_: [f64; 4],
324     }
325 }
326 
327 cfg_if! {
328     if #[cfg(feature = "extra_traits")] {
329         impl PartialEq for user_fpregs_struct {
330             fn eq(&self, other: &user_fpregs_struct) -> bool {
331                 self.cwd == other.cwd
332                     && self.swd == other.swd
333                     && self.ftw == other.ftw
334                     && self.fop == other.fop
335                     && self.rip == other.rip
336                     && self.rdp == other.rdp
337                     && self.mxcsr == other.mxcsr
338                     && self.mxcr_mask == other.mxcr_mask
339                     && self.st_space == other.st_space
340                     && self
341                         .xmm_space
342                         .iter()
343                         .zip(other.xmm_space.iter())
344                         .all(|(a, b)| a == b)
345                 // Ignore padding field
346             }
347         }
348 
349         impl Eq for user_fpregs_struct {}
350 
351         impl hash::Hash for user_fpregs_struct {
352             fn hash<H: hash::Hasher>(&self, state: &mut H) {
353                 self.cwd.hash(state);
354                 self.ftw.hash(state);
355                 self.fop.hash(state);
356                 self.rip.hash(state);
357                 self.rdp.hash(state);
358                 self.mxcsr.hash(state);
359                 self.mxcr_mask.hash(state);
360                 self.st_space.hash(state);
361                 self.xmm_space.hash(state);
362                 // Ignore padding field
363             }
364         }
365 
366         impl PartialEq for ucontext_t {
367             fn eq(&self, other: &ucontext_t) -> bool {
368                 self.uc_flags == other.uc_flags
369                     && self.uc_link == other.uc_link
370                     && self.uc_stack == other.uc_stack
371                     && self.uc_mcontext == other.uc_mcontext
372                     && self.uc_sigmask == other.uc_sigmask
373                 // Ignore __private field
374             }
375         }
376 
377         impl Eq for ucontext_t {}
378 
379         impl hash::Hash for ucontext_t {
380             fn hash<H: hash::Hasher>(&self, state: &mut H) {
381                 self.uc_flags.hash(state);
382                 self.uc_link.hash(state);
383                 self.uc_stack.hash(state);
384                 self.uc_mcontext.hash(state);
385                 self.uc_sigmask.hash(state);
386                 // Ignore __private field
387             }
388         }
389     }
390 }
391 
392 pub const POSIX_FADV_DONTNEED: c_int = 4;
393 pub const POSIX_FADV_NOREUSE: c_int = 5;
394 
395 pub const VEOF: usize = 4;
396 pub const RTLD_DEEPBIND: c_int = 0x8;
397 pub const RTLD_GLOBAL: c_int = 0x100;
398 pub const RTLD_NOLOAD: c_int = 0x4;
399 
400 pub const O_APPEND: c_int = 1024;
401 pub const O_CREAT: c_int = 64;
402 pub const O_EXCL: c_int = 128;
403 pub const O_NOCTTY: c_int = 256;
404 pub const O_NONBLOCK: c_int = 2048;
405 pub const O_SYNC: c_int = 1052672;
406 pub const O_RSYNC: c_int = 1052672;
407 pub const O_DSYNC: c_int = 4096;
408 pub const O_FSYNC: c_int = 0x101000;
409 pub const O_NOATIME: c_int = 0o1000000;
410 pub const O_PATH: c_int = 0o10000000;
411 pub const O_TMPFILE: c_int = 0o20000000 | O_DIRECTORY;
412 
413 pub const MADV_SOFT_OFFLINE: c_int = 101;
414 pub const MAP_GROWSDOWN: c_int = 0x0100;
415 
416 pub const EDEADLK: c_int = 35;
417 pub const ENAMETOOLONG: c_int = 36;
418 pub const ENOLCK: c_int = 37;
419 pub const ENOSYS: c_int = 38;
420 pub const ENOTEMPTY: c_int = 39;
421 pub const ELOOP: c_int = 40;
422 pub const ENOMSG: c_int = 42;
423 pub const EIDRM: c_int = 43;
424 pub const ECHRNG: c_int = 44;
425 pub const EL2NSYNC: c_int = 45;
426 pub const EL3HLT: c_int = 46;
427 pub const EL3RST: c_int = 47;
428 pub const ELNRNG: c_int = 48;
429 pub const EUNATCH: c_int = 49;
430 pub const ENOCSI: c_int = 50;
431 pub const EL2HLT: c_int = 51;
432 pub const EBADE: c_int = 52;
433 pub const EBADR: c_int = 53;
434 pub const EXFULL: c_int = 54;
435 pub const ENOANO: c_int = 55;
436 pub const EBADRQC: c_int = 56;
437 pub const EBADSLT: c_int = 57;
438 pub const EMULTIHOP: c_int = 72;
439 pub const EOVERFLOW: c_int = 75;
440 pub const ENOTUNIQ: c_int = 76;
441 pub const EBADFD: c_int = 77;
442 pub const EBADMSG: c_int = 74;
443 pub const EREMCHG: c_int = 78;
444 pub const ELIBACC: c_int = 79;
445 pub const ELIBBAD: c_int = 80;
446 pub const ELIBSCN: c_int = 81;
447 pub const ELIBMAX: c_int = 82;
448 pub const ELIBEXEC: c_int = 83;
449 pub const EILSEQ: c_int = 84;
450 pub const ERESTART: c_int = 85;
451 pub const ESTRPIPE: c_int = 86;
452 pub const EUSERS: c_int = 87;
453 pub const ENOTSOCK: c_int = 88;
454 pub const EDESTADDRREQ: c_int = 89;
455 pub const EMSGSIZE: c_int = 90;
456 pub const EPROTOTYPE: c_int = 91;
457 pub const ENOPROTOOPT: c_int = 92;
458 pub const EPROTONOSUPPORT: c_int = 93;
459 pub const ESOCKTNOSUPPORT: c_int = 94;
460 pub const EOPNOTSUPP: c_int = 95;
461 pub const EPFNOSUPPORT: c_int = 96;
462 pub const EAFNOSUPPORT: c_int = 97;
463 pub const EADDRINUSE: c_int = 98;
464 pub const EADDRNOTAVAIL: c_int = 99;
465 pub const ENETDOWN: c_int = 100;
466 pub const ENETUNREACH: c_int = 101;
467 pub const ENETRESET: c_int = 102;
468 pub const ECONNABORTED: c_int = 103;
469 pub const ECONNRESET: c_int = 104;
470 pub const ENOBUFS: c_int = 105;
471 pub const EISCONN: c_int = 106;
472 pub const ENOTCONN: c_int = 107;
473 pub const ESHUTDOWN: c_int = 108;
474 pub const ETOOMANYREFS: c_int = 109;
475 pub const ETIMEDOUT: c_int = 110;
476 pub const ECONNREFUSED: c_int = 111;
477 pub const EHOSTDOWN: c_int = 112;
478 pub const EHOSTUNREACH: c_int = 113;
479 pub const EALREADY: c_int = 114;
480 pub const EINPROGRESS: c_int = 115;
481 pub const ESTALE: c_int = 116;
482 pub const EDQUOT: c_int = 122;
483 pub const ENOMEDIUM: c_int = 123;
484 pub const EMEDIUMTYPE: c_int = 124;
485 pub const ECANCELED: c_int = 125;
486 pub const ENOKEY: c_int = 126;
487 pub const EKEYEXPIRED: c_int = 127;
488 pub const EKEYREVOKED: c_int = 128;
489 pub const EKEYREJECTED: c_int = 129;
490 pub const EOWNERDEAD: c_int = 130;
491 pub const ENOTRECOVERABLE: c_int = 131;
492 pub const EHWPOISON: c_int = 133;
493 pub const ERFKILL: c_int = 132;
494 
495 pub const SOCK_STREAM: c_int = 1;
496 pub const SOCK_DGRAM: c_int = 2;
497 
498 pub const SA_ONSTACK: c_int = 0x08000000;
499 pub const SA_SIGINFO: c_int = 0x00000004;
500 pub const SA_NOCLDWAIT: c_int = 0x00000002;
501 
502 pub const SIGTTIN: c_int = 21;
503 pub const SIGTTOU: c_int = 22;
504 pub const SIGXCPU: c_int = 24;
505 pub const SIGXFSZ: c_int = 25;
506 pub const SIGVTALRM: c_int = 26;
507 pub const SIGPROF: c_int = 27;
508 pub const SIGWINCH: c_int = 28;
509 pub const SIGCHLD: c_int = 17;
510 pub const SIGBUS: c_int = 7;
511 pub const SIGUSR1: c_int = 10;
512 pub const SIGUSR2: c_int = 12;
513 pub const SIGCONT: c_int = 18;
514 pub const SIGSTOP: c_int = 19;
515 pub const SIGTSTP: c_int = 20;
516 pub const SIGURG: c_int = 23;
517 pub const SIGIO: c_int = 29;
518 pub const SIGSYS: c_int = 31;
519 pub const SIGSTKFLT: c_int = 16;
520 #[deprecated(since = "0.2.55", note = "Use SIGSYS instead")]
521 pub const SIGUNUSED: c_int = 31;
522 pub const SIGPOLL: c_int = 29;
523 pub const SIGPWR: c_int = 30;
524 pub const SIG_SETMASK: c_int = 2;
525 pub const SIG_BLOCK: c_int = 0x000000;
526 pub const SIG_UNBLOCK: c_int = 0x01;
527 
528 pub const POLLWRNORM: c_short = 0x100;
529 pub const POLLWRBAND: c_short = 0x200;
530 
531 pub const O_ASYNC: c_int = 0x2000;
532 pub const O_NDELAY: c_int = 0x800;
533 
534 pub const PTRACE_DETACH: c_uint = 17;
535 pub const PTRACE_GET_RSEQ_CONFIGURATION: c_uint = 0x420f;
536 
537 pub const EFD_NONBLOCK: c_int = 0x800;
538 
539 pub const F_GETLK: c_int = 5;
540 pub const F_GETOWN: c_int = 9;
541 pub const F_SETOWN: c_int = 8;
542 pub const F_SETLK: c_int = 6;
543 pub const F_SETLKW: c_int = 7;
544 pub const F_OFD_GETLK: c_int = 36;
545 pub const F_OFD_SETLK: c_int = 37;
546 pub const F_OFD_SETLKW: c_int = 38;
547 
548 pub const F_RDLCK: c_int = 0;
549 pub const F_WRLCK: c_int = 1;
550 pub const F_UNLCK: c_int = 2;
551 
552 pub const SFD_NONBLOCK: c_int = 0x0800;
553 
554 pub const TCSANOW: c_int = 0;
555 pub const TCSADRAIN: c_int = 1;
556 pub const TCSAFLUSH: c_int = 2;
557 
558 pub const SFD_CLOEXEC: c_int = 0x080000;
559 
560 pub const NCCS: usize = 32;
561 
562 pub const O_TRUNC: c_int = 512;
563 
564 pub const O_CLOEXEC: c_int = 0x80000;
565 
566 pub const EBFONT: c_int = 59;
567 pub const ENOSTR: c_int = 60;
568 pub const ENODATA: c_int = 61;
569 pub const ETIME: c_int = 62;
570 pub const ENOSR: c_int = 63;
571 pub const ENONET: c_int = 64;
572 pub const ENOPKG: c_int = 65;
573 pub const EREMOTE: c_int = 66;
574 pub const ENOLINK: c_int = 67;
575 pub const EADV: c_int = 68;
576 pub const ESRMNT: c_int = 69;
577 pub const ECOMM: c_int = 70;
578 pub const EPROTO: c_int = 71;
579 pub const EDOTDOT: c_int = 73;
580 
581 pub const SA_NODEFER: c_int = 0x40000000;
582 pub const SA_RESETHAND: c_int = 0x80000000;
583 pub const SA_RESTART: c_int = 0x10000000;
584 pub const SA_NOCLDSTOP: c_int = 0x00000001;
585 
586 pub const EPOLL_CLOEXEC: c_int = 0x80000;
587 
588 pub const EFD_CLOEXEC: c_int = 0x80000;
589 
590 pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4;
591 pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4;
592 pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4;
593 
594 pub const O_DIRECT: c_int = 0x4000;
595 pub const O_DIRECTORY: c_int = 0x10000;
596 pub const O_NOFOLLOW: c_int = 0x20000;
597 
598 pub const MAP_HUGETLB: c_int = 0x040000;
599 pub const MAP_LOCKED: c_int = 0x02000;
600 pub const MAP_NORESERVE: c_int = 0x04000;
601 pub const MAP_32BIT: c_int = 0x0040;
602 pub const MAP_ANON: c_int = 0x0020;
603 pub const MAP_ANONYMOUS: c_int = 0x0020;
604 pub const MAP_DENYWRITE: c_int = 0x0800;
605 pub const MAP_EXECUTABLE: c_int = 0x01000;
606 pub const MAP_POPULATE: c_int = 0x08000;
607 pub const MAP_NONBLOCK: c_int = 0x010000;
608 pub const MAP_STACK: c_int = 0x020000;
609 pub const MAP_SYNC: c_int = 0x080000;
610 
611 pub const EDEADLOCK: c_int = 35;
612 pub const EUCLEAN: c_int = 117;
613 pub const ENOTNAM: c_int = 118;
614 pub const ENAVAIL: c_int = 119;
615 pub const EISNAM: c_int = 120;
616 pub const EREMOTEIO: c_int = 121;
617 
618 pub const PTRACE_GETFPREGS: c_uint = 14;
619 pub const PTRACE_SETFPREGS: c_uint = 15;
620 pub const PTRACE_GETFPXREGS: c_uint = 18;
621 pub const PTRACE_SETFPXREGS: c_uint = 19;
622 pub const PTRACE_GETREGS: c_uint = 12;
623 pub const PTRACE_SETREGS: c_uint = 13;
624 pub const PTRACE_PEEKSIGINFO_SHARED: c_uint = 1;
625 pub const PTRACE_SYSEMU: c_uint = 31;
626 pub const PTRACE_SYSEMU_SINGLESTEP: c_uint = 32;
627 
628 pub const PR_GET_SPECULATION_CTRL: c_int = 52;
629 pub const PR_SET_SPECULATION_CTRL: c_int = 53;
630 pub const PR_SPEC_NOT_AFFECTED: c_uint = 0;
631 pub const PR_SPEC_PRCTL: c_uint = 1 << 0;
632 pub const PR_SPEC_ENABLE: c_uint = 1 << 1;
633 pub const PR_SPEC_DISABLE: c_uint = 1 << 2;
634 pub const PR_SPEC_FORCE_DISABLE: c_uint = 1 << 3;
635 pub const PR_SPEC_DISABLE_NOEXEC: c_uint = 1 << 4;
636 pub const PR_SPEC_STORE_BYPASS: c_int = 0;
637 pub const PR_SPEC_INDIRECT_BRANCH: c_int = 1;
638 // FIXME(linux): perharps for later
639 //pub const PR_SPEC_L1D_FLUSH: c_int = 2;
640 
641 pub const MCL_CURRENT: c_int = 0x0001;
642 pub const MCL_FUTURE: c_int = 0x0002;
643 pub const MCL_ONFAULT: c_int = 0x0004;
644 
645 pub const SIGSTKSZ: size_t = 8192;
646 pub const MINSIGSTKSZ: size_t = 2048;
647 pub const CBAUD: crate::tcflag_t = 0o0010017;
648 pub const TAB1: crate::tcflag_t = 0x00000800;
649 pub const TAB2: crate::tcflag_t = 0x00001000;
650 pub const TAB3: crate::tcflag_t = 0x00001800;
651 pub const CR1: crate::tcflag_t = 0x00000200;
652 pub const CR2: crate::tcflag_t = 0x00000400;
653 pub const CR3: crate::tcflag_t = 0x00000600;
654 pub const FF1: crate::tcflag_t = 0x00008000;
655 pub const BS1: crate::tcflag_t = 0x00002000;
656 pub const VT1: crate::tcflag_t = 0x00004000;
657 pub const VWERASE: usize = 14;
658 pub const VREPRINT: usize = 12;
659 pub const VSUSP: usize = 10;
660 pub const VSTART: usize = 8;
661 pub const VSTOP: usize = 9;
662 pub const VDISCARD: usize = 13;
663 pub const VTIME: usize = 5;
664 pub const IXON: crate::tcflag_t = 0x00000400;
665 pub const IXOFF: crate::tcflag_t = 0x00001000;
666 pub const ONLCR: crate::tcflag_t = 0x4;
667 pub const CSIZE: crate::tcflag_t = 0x00000030;
668 pub const CS6: crate::tcflag_t = 0x00000010;
669 pub const CS7: crate::tcflag_t = 0x00000020;
670 pub const CS8: crate::tcflag_t = 0x00000030;
671 pub const CSTOPB: crate::tcflag_t = 0x00000040;
672 pub const CREAD: crate::tcflag_t = 0x00000080;
673 pub const PARENB: crate::tcflag_t = 0x00000100;
674 pub const PARODD: crate::tcflag_t = 0x00000200;
675 pub const HUPCL: crate::tcflag_t = 0x00000400;
676 pub const CLOCAL: crate::tcflag_t = 0x00000800;
677 pub const ECHOKE: crate::tcflag_t = 0x00000800;
678 pub const ECHOE: crate::tcflag_t = 0x00000010;
679 pub const ECHOK: crate::tcflag_t = 0x00000020;
680 pub const ECHONL: crate::tcflag_t = 0x00000040;
681 pub const ECHOPRT: crate::tcflag_t = 0x00000400;
682 pub const ECHOCTL: crate::tcflag_t = 0x00000200;
683 pub const ISIG: crate::tcflag_t = 0x00000001;
684 pub const ICANON: crate::tcflag_t = 0x00000002;
685 pub const PENDIN: crate::tcflag_t = 0x00004000;
686 pub const NOFLSH: crate::tcflag_t = 0x00000080;
687 pub const CIBAUD: crate::tcflag_t = 0o02003600000;
688 pub const CBAUDEX: crate::tcflag_t = 0o010000;
689 pub const VSWTC: usize = 7;
690 pub const OLCUC: crate::tcflag_t = 0o000002;
691 pub const NLDLY: crate::tcflag_t = 0o000400;
692 pub const CRDLY: crate::tcflag_t = 0o003000;
693 pub const TABDLY: crate::tcflag_t = 0o014000;
694 pub const BSDLY: crate::tcflag_t = 0o020000;
695 pub const FFDLY: crate::tcflag_t = 0o100000;
696 pub const VTDLY: crate::tcflag_t = 0o040000;
697 pub const XTABS: crate::tcflag_t = 0o014000;
698 
699 pub const B0: crate::speed_t = 0o000000;
700 pub const B50: crate::speed_t = 0o000001;
701 pub const B75: crate::speed_t = 0o000002;
702 pub const B110: crate::speed_t = 0o000003;
703 pub const B134: crate::speed_t = 0o000004;
704 pub const B150: crate::speed_t = 0o000005;
705 pub const B200: crate::speed_t = 0o000006;
706 pub const B300: crate::speed_t = 0o000007;
707 pub const B600: crate::speed_t = 0o000010;
708 pub const B1200: crate::speed_t = 0o000011;
709 pub const B1800: crate::speed_t = 0o000012;
710 pub const B2400: crate::speed_t = 0o000013;
711 pub const B4800: crate::speed_t = 0o000014;
712 pub const B9600: crate::speed_t = 0o000015;
713 pub const B19200: crate::speed_t = 0o000016;
714 pub const B38400: crate::speed_t = 0o000017;
715 pub const EXTA: crate::speed_t = B19200;
716 pub const EXTB: crate::speed_t = B38400;
717 pub const B57600: crate::speed_t = 0o010001;
718 pub const B115200: crate::speed_t = 0o010002;
719 pub const B230400: crate::speed_t = 0o010003;
720 pub const B460800: crate::speed_t = 0o010004;
721 pub const B500000: crate::speed_t = 0o010005;
722 pub const B576000: crate::speed_t = 0o010006;
723 pub const B921600: crate::speed_t = 0o010007;
724 pub const B1000000: crate::speed_t = 0o010010;
725 pub const B1152000: crate::speed_t = 0o010011;
726 pub const B1500000: crate::speed_t = 0o010012;
727 pub const B2000000: crate::speed_t = 0o010013;
728 pub const B2500000: crate::speed_t = 0o010014;
729 pub const B3000000: crate::speed_t = 0o010015;
730 pub const B3500000: crate::speed_t = 0o010016;
731 pub const B4000000: crate::speed_t = 0o010017;
732 
733 pub const VEOL: usize = 11;
734 pub const VEOL2: usize = 16;
735 pub const VMIN: usize = 6;
736 pub const IEXTEN: crate::tcflag_t = 0x00008000;
737 pub const TOSTOP: crate::tcflag_t = 0x00000100;
738 pub const FLUSHO: crate::tcflag_t = 0x00001000;
739 pub const EXTPROC: crate::tcflag_t = 0x00010000;
740 
741 // offsets in user_regs_structs, from sys/reg.h
742 pub const R15: c_int = 0;
743 pub const R14: c_int = 1;
744 pub const R13: c_int = 2;
745 pub const R12: c_int = 3;
746 pub const RBP: c_int = 4;
747 pub const RBX: c_int = 5;
748 pub const R11: c_int = 6;
749 pub const R10: c_int = 7;
750 pub const R9: c_int = 8;
751 pub const R8: c_int = 9;
752 pub const RAX: c_int = 10;
753 pub const RCX: c_int = 11;
754 pub const RDX: c_int = 12;
755 pub const RSI: c_int = 13;
756 pub const RDI: c_int = 14;
757 pub const ORIG_RAX: c_int = 15;
758 pub const RIP: c_int = 16;
759 pub const CS: c_int = 17;
760 pub const EFLAGS: c_int = 18;
761 pub const RSP: c_int = 19;
762 pub const SS: c_int = 20;
763 pub const FS_BASE: c_int = 21;
764 pub const GS_BASE: c_int = 22;
765 pub const DS: c_int = 23;
766 pub const ES: c_int = 24;
767 pub const FS: c_int = 25;
768 pub const GS: c_int = 26;
769 
770 // offsets in mcontext_t.gregs from sys/ucontext.h
771 pub const REG_R8: c_int = 0;
772 pub const REG_R9: c_int = 1;
773 pub const REG_R10: c_int = 2;
774 pub const REG_R11: c_int = 3;
775 pub const REG_R12: c_int = 4;
776 pub const REG_R13: c_int = 5;
777 pub const REG_R14: c_int = 6;
778 pub const REG_R15: c_int = 7;
779 pub const REG_RDI: c_int = 8;
780 pub const REG_RSI: c_int = 9;
781 pub const REG_RBP: c_int = 10;
782 pub const REG_RBX: c_int = 11;
783 pub const REG_RDX: c_int = 12;
784 pub const REG_RAX: c_int = 13;
785 pub const REG_RCX: c_int = 14;
786 pub const REG_RSP: c_int = 15;
787 pub const REG_RIP: c_int = 16;
788 pub const REG_EFL: c_int = 17;
789 pub const REG_CSGSFS: c_int = 18;
790 pub const REG_ERR: c_int = 19;
791 pub const REG_TRAPNO: c_int = 20;
792 pub const REG_OLDMASK: c_int = 21;
793 pub const REG_CR2: c_int = 22;
794 
795 extern "C" {
getcontext(ucp: *mut ucontext_t) -> c_int796     pub fn getcontext(ucp: *mut ucontext_t) -> c_int;
setcontext(ucp: *const ucontext_t) -> c_int797     pub fn setcontext(ucp: *const ucontext_t) -> c_int;
makecontext(ucp: *mut ucontext_t, func: extern "C" fn(), argc: c_int, ...)798     pub fn makecontext(ucp: *mut ucontext_t, func: extern "C" fn(), argc: c_int, ...);
swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> c_int799     pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> c_int;
800 }
801 
802 cfg_if! {
803     if #[cfg(target_pointer_width = "32")] {
804         mod x32;
805         pub use self::x32::*;
806     } else {
807         mod not_x32;
808         pub use self::not_x32::*;
809     }
810 }
811