xref: /third_party/rust/crates/libc/src/unix/nto/x86_64.rs (revision 2add0d91)
1pub type c_char = i8;
2pub type wchar_t = u32;
3pub type c_long = i64;
4pub type c_ulong = u64;
5pub type time_t = i64;
6
7s! {
8    #[repr(align(8))]
9    pub struct x86_64_cpu_registers {
10        pub rdi: u64,
11        pub rsi: u64,
12        pub rdx: u64,
13        pub r10: u64,
14        pub r8: u64,
15        pub r9: u64,
16        pub rax: u64,
17        pub rbx: u64,
18        pub rbp: u64,
19        pub rcx: u64,
20        pub r11: u64,
21        pub r12: u64,
22        pub r13: u64,
23        pub r14: u64,
24        pub r15: u64,
25        pub rip: u64,
26        pub cs: u32,
27        rsvd1: u32,
28        pub rflags: u64,
29        pub rsp: u64,
30        pub ss: u32,
31        rsvd2: u32,
32    }
33
34    #[repr(align(8))]
35    pub struct mcontext_t {
36        pub cpu: x86_64_cpu_registers,
37        #[cfg(libc_union)]
38        pub fpu: x86_64_fpu_registers,
39        #[cfg(not(libc_union))]
40        __reserved: [u8; 1024],
41    }
42
43    pub struct stack_t {
44        pub ss_sp: *mut ::c_void,
45        pub ss_size: ::size_t,
46        pub ss_flags: ::c_int,
47    }
48
49    pub struct fsave_area_64 {
50        pub fpu_control_word: u32,
51        pub fpu_status_word: u32,
52        pub fpu_tag_word: u32,
53        pub fpu_ip: u32,
54        pub fpu_cs: u32,
55        pub fpu_op: u32,
56        pub fpu_ds: u32,
57        pub st_regs: [u8; 80],
58   }
59
60    pub struct fxsave_area_64 {
61        pub fpu_control_word: u16,
62        pub fpu_status_word: u16,
63        pub fpu_tag_word: u16,
64        pub fpu_operand: u16,
65        pub fpu_rip: u64,
66        pub fpu_rdp: u64,
67        pub mxcsr: u32,
68        pub mxcsr_mask: u32,
69        pub st_regs: [u8; 128],
70        pub xmm_regs: [u8; 128],
71        reserved2: [u8; 224],
72    }
73
74    pub struct fpu_extention_savearea_64 {
75        pub other: [u8; 512],
76        pub xstate_bv: u64,
77        pub xstate_undef: [u64; 7],
78        pub xstate_info: [u8; 224],
79    }
80}
81
82s_no_extra_traits! {
83    #[cfg(libc_union)]
84    pub union x86_64_fpu_registers {
85        pub fsave_area: fsave_area_64,
86        pub fxsave_area: fxsave_area_64,
87        pub xsave_area: fpu_extention_savearea_64,
88        pub data: [u8; 1024],
89    }
90}
91
92cfg_if! {
93    if #[cfg(feature = "extra_traits")] {
94        #[cfg(libc_union)]
95        impl Eq for x86_64_fpu_registers {}
96
97        #[cfg(libc_union)]
98        impl PartialEq for x86_64_fpu_registers {
99            fn eq(&self, other: &x86_64_fpu_registers) -> bool {
100                unsafe {
101                    self.fsave_area == other.fsave_area
102                        || self.fxsave_area == other.fxsave_area
103                        || self.xsave_area == other.xsave_area
104                }
105            }
106        }
107
108        #[cfg(libc_union)]
109        impl ::fmt::Debug for x86_64_fpu_registers {
110            fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
111                unsafe {
112                    f.debug_struct("x86_64_fpu_registers")
113                        .field("fsave_area", &self.fsave_area)
114                        .field("fxsave_area", &self.fxsave_area)
115                        .field("xsave_area", &self.xsave_area)
116                        .finish()
117                }
118            }
119        }
120
121        #[cfg(libc_union)]
122        impl ::hash::Hash for x86_64_fpu_registers {
123            fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
124                unsafe {
125                    self.fsave_area.hash(state);
126                    self.fxsave_area.hash(state);
127                    self.xsave_area.hash(state);
128                }
129            }
130        }
131    }
132}
133