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