blob: 3a1d230bb98eb4581ceeb7ff900942d0bebe20a2 [file] [log] [blame]
pub type c_char = i8;
pub type wchar_t = u32;
pub type c_long = i64;
pub type c_ulong = u64;
pub type time_t = i64;
s! {
#[repr(align(8))]
pub struct x86_64_cpu_registers {
pub rdi: u64,
pub rsi: u64,
pub rdx: u64,
pub r10: u64,
pub r8: u64,
pub r9: u64,
pub rax: u64,
pub rbx: u64,
pub rbp: u64,
pub rcx: u64,
pub r11: u64,
pub r12: u64,
pub r13: u64,
pub r14: u64,
pub r15: u64,
pub rip: u64,
pub cs: u32,
rsvd1: u32,
pub rflags: u64,
pub rsp: u64,
pub ss: u32,
rsvd2: u32,
}
#[repr(align(8))]
pub struct mcontext_t {
pub cpu: x86_64_cpu_registers,
#[cfg(libc_union)]
pub fpu: x86_64_fpu_registers,
#[cfg(not(libc_union))]
__reserved: [u8; 1024],
}
pub struct stack_t {
pub ss_sp: *mut ::c_void,
pub ss_size: ::size_t,
pub ss_flags: ::c_int,
}
pub struct fsave_area_64 {
pub fpu_control_word: u32,
pub fpu_status_word: u32,
pub fpu_tag_word: u32,
pub fpu_ip: u32,
pub fpu_cs: u32,
pub fpu_op: u32,
pub fpu_ds: u32,
pub st_regs: [u8; 80],
}
pub struct fxsave_area_64 {
pub fpu_control_word: u16,
pub fpu_status_word: u16,
pub fpu_tag_word: u16,
pub fpu_operand: u16,
pub fpu_rip: u64,
pub fpu_rdp: u64,
pub mxcsr: u32,
pub mxcsr_mask: u32,
pub st_regs: [u8; 128],
pub xmm_regs: [u8; 128],
reserved2: [u8; 224],
}
pub struct fpu_extention_savearea_64 {
pub other: [u8; 512],
pub xstate_bv: u64,
pub xstate_undef: [u64; 7],
pub xstate_info: [u8; 224],
}
}
s_no_extra_traits! {
#[cfg(libc_union)]
pub union x86_64_fpu_registers {
pub fsave_area: fsave_area_64,
pub fxsave_area: fxsave_area_64,
pub xsave_area: fpu_extention_savearea_64,
pub data: [u8; 1024],
}
}
cfg_if! {
if #[cfg(feature = "extra_traits")] {
#[cfg(libc_union)]
impl Eq for x86_64_fpu_registers {}
#[cfg(libc_union)]
impl PartialEq for x86_64_fpu_registers {
fn eq(&self, other: &x86_64_fpu_registers) -> bool {
unsafe {
self.fsave_area == other.fsave_area
|| self.fxsave_area == other.fxsave_area
|| self.xsave_area == other.xsave_area
}
}
}
#[cfg(libc_union)]
impl ::fmt::Debug for x86_64_fpu_registers {
fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result {
unsafe {
f.debug_struct("x86_64_fpu_registers")
.field("fsave_area", &self.fsave_area)
.field("fxsave_area", &self.fxsave_area)
.field("xsave_area", &self.xsave_area)
.finish()
}
}
}
#[cfg(libc_union)]
impl ::hash::Hash for x86_64_fpu_registers {
fn hash<H: ::hash::Hasher>(&self, state: &mut H) {
unsafe {
self.fsave_area.hash(state);
self.fxsave_area.hash(state);
self.xsave_area.hash(state);
}
}
}
}
}