From a3f8a1845f741c31d9c88b144cdb2520a84b646b Mon Sep 17 00:00:00 2001 From: Logan Wendholt <lwendholt@gmail.com> Date: Fri, 23 Aug 2019 10:31:36 -0400 Subject: [PATCH] Update musl x86_64 to match bits/user.h --- src/unix/linux_like/linux/musl/b64/x86_64.rs | 144 +++++++++++++++---- 1 file changed, 117 insertions(+), 27 deletions(-) diff --git a/src/unix/linux_like/linux/musl/b64/x86_64.rs b/src/unix/linux_like/linux/musl/b64/x86_64.rs index 2eda091f..ad28b307 100644 --- a/src/unix/linux_like/linux/musl/b64/x86_64.rs +++ b/src/unix/linux_like/linux/musl/b64/x86_64.rs @@ -48,33 +48,55 @@ s! { } pub struct user_regs_struct { - pub r15: ::c_ulonglong, - pub r14: ::c_ulonglong, - pub r13: ::c_ulonglong, - pub r12: ::c_ulonglong, - pub rbp: ::c_ulonglong, - pub rbx: ::c_ulonglong, - pub r11: ::c_ulonglong, - pub r10: ::c_ulonglong, - pub r9: ::c_ulonglong, - pub r8: ::c_ulonglong, - pub rax: ::c_ulonglong, - pub rcx: ::c_ulonglong, - pub rdx: ::c_ulonglong, - pub rsi: ::c_ulonglong, - pub rdi: ::c_ulonglong, - pub orig_rax: ::c_ulonglong, - pub rip: ::c_ulonglong, - pub cs: ::c_ulonglong, - pub eflags: ::c_ulonglong, - pub rsp: ::c_ulonglong, - pub ss: ::c_ulonglong, - pub fs_base: ::c_ulonglong, - pub gs_base: ::c_ulonglong, - pub ds: ::c_ulonglong, - pub es: ::c_ulonglong, - pub fs: ::c_ulonglong, - pub gs: ::c_ulonglong, + pub r15: ::c_ulong, + pub r14: ::c_ulong, + pub r13: ::c_ulong, + pub r12: ::c_ulong, + pub rbp: ::c_ulong, + pub rbx: ::c_ulong, + pub r11: ::c_ulong, + pub r10: ::c_ulong, + pub r9: ::c_ulong, + pub r8: ::c_ulong, + pub rax: ::c_ulong, + pub rcx: ::c_ulong, + pub rdx: ::c_ulong, + pub rsi: ::c_ulong, + pub rdi: ::c_ulong, + pub orig_rax: ::c_ulong, + pub rip: ::c_ulong, + pub cs: ::c_ulong, + pub eflags: ::c_ulong, + pub rsp: ::c_ulong, + pub ss: ::c_ulong, + pub fs_base: ::c_ulong, + pub gs_base: ::c_ulong, + pub ds: ::c_ulong, + pub es: ::c_ulong, + pub fs: ::c_ulong, + pub gs: ::c_ulong, + } + + pub struct user { + pub regs: user_regs_struct, + pub u_fpvalid: ::c_int, + pub i387: user_fpregs_struct, + pub u_tsize: ::c_ulong, + pub u_dsize: ::c_ulong, + pub u_ssize: ::c_ulong, + pub start_code: ::c_ulong, + pub start_stack: ::c_ulong, + pub signal: ::c_long, + __reserved: ::c_int, + #[cfg(target_pointer_width = "32")] + __pad1: u32, + pub u_ar0: *mut user_regs_struct, + #[cfg(target_pointer_width = "32")] + __pad2: u32, + pub u_fpstate: *mut user_fpregs_struct, + pub magic: ::c_ulong, + pub u_comm: [::c_char; 32], + pub u_debugreg: [::c_ulong; 8], } pub struct mcontext_t { @@ -95,6 +117,20 @@ s! { } s_no_extra_traits!{ + pub struct user_fpregs_struct { + pub cwd: ::c_ushort, + pub swd: ::c_ushort, + pub ftw: ::c_ushort, + pub fop: ::c_ushort, + pub rip: ::c_ulonglong, + pub rdp: ::c_ulonglong, + pub mxcsr: ::c_uint, + pub mxcr_mask: ::c_uint, + pub st_space: [::c_uint; 32], + pub xmm_space: [::c_uint; 64], + padding: [::c_uint; 24], + } + pub struct ucontext_t { pub uc_flags: ::c_ulong, pub uc_link: *mut ucontext_t, @@ -107,6 +143,60 @@ s_no_extra_traits!{ cfg_if! { if #[cfg(feature = "extra_traits")] { + impl PartialEq for user_fpregs_struct { + fn eq(&self, other: &user_fpregs_struct) -> bool { + self.cwd == other.cwd + && self.swd == other.swd + && self.ftw == other.ftw + && self.fop == other.fop + && self.rip == other.rip + && self.rdp == other.rdp + && self.mxcsr == other.mxcsr + && self.mxcr_mask == other.mxcr_mask + && self.st_space == other.st_space + && self + .xmm_space + .iter() + .zip(other.xmm_space.iter()) + .all(|(a,b)| a == b) + // Ignore padding field + } + } + + impl Eq for user_fpregs_struct {} + + impl ::fmt::Debug for user_fpregs_struct { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("user_fpregs_struct") + .field("cwd", &self.cwd) + .field("ftw", &self.ftw) + .field("fop", &self.fop) + .field("rip", &self.rip) + .field("rdp", &self.rdp) + .field("mxcsr", &self.mxcsr) + .field("mxcr_mask", &self.mxcr_mask) + .field("st_space", &self.st_space) + // FIXME: .field("xmm_space", &self.xmm_space) + // Ignore padding field + .finish() + } + } + + impl ::hash::Hash for user_fpregs_struct { + fn hash<H: ::hash::Hasher>(&self, state: &mut H) { + self.cwd.hash(state); + self.ftw.hash(state); + self.fop.hash(state); + self.rip.hash(state); + self.rdp.hash(state); + self.mxcsr.hash(state); + self.mxcr_mask.hash(state); + self.st_space.hash(state); + self.xmm_space.hash(state); + // Ignore padding field + } + } + impl PartialEq for ucontext_t { fn eq(&self, other: &ucontext_t) -> bool { self.uc_flags == other.uc_flags -- GitLab