• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 pub type c_char = i8;
2 pub type wchar_t = u32;
3 pub type c_long = i64;
4 pub type c_ulong = u64;
5 pub type time_t = i64;
6 
7 s! {
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 
82 s_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 
92 cfg_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