process-backend 0.1.0

Providers helpers for reading process memory specialized for minidump-writer
Documentation
pub use imp::*;

#[cfg(target_arch = "aarch64")]
mod imp {
    pub type GenRegs = libc::user_regs_struct;
    pub type FpRegs = user_fpsimd_struct;

    /// https://github.com/rust-lang/libc/pull/2719
    #[repr(C)]
    #[derive(Debug)]
    pub struct user_fpsimd_struct {
        pub vregs: [u128; 32],
        pub fpsr: u32,
        pub fpcr: u32,
    }
}

#[cfg(target_arch = "arm")]
mod imp {
    pub type GenRegs = user_regs_struct;
    pub type FpRegs = user_fpregs_struct;

    // Not defined by libc because this works only for cores support VFP
    #[repr(C)]
    #[derive(Debug, Eq, Hash, PartialEq, Copy, Clone, Default)]
    pub struct user_fpregs_struct {
        pub fpregs: [u64; 32],
        pub fpscr: u32,
    }

    #[repr(C)]
    #[derive(Debug, Eq, Hash, PartialEq, Copy, Clone, Default)]
    pub struct user_regs_struct {
        pub uregs: [u32; 18],
    }
}

#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
mod imp {
    pub type GenRegs = user_regs_struct;
    pub type FpRegs = user_fpregs_struct;

    #[cfg(target_arch = "x86")]
    pub type FpxRegs = user_fpxregs_struct;

    pub const NUM_DEBUG_REGISTERS: usize = 8;

    #[cfg(target_arch = "x86")]
    pub type RegType = u32;

    #[cfg(target_arch = "x86_64")]
    pub type RegType = u64;

    #[cfg(all(not(target_os = "android"), target_arch = "x86"))]
    pub use libc::user_fpxregs_struct;
    #[cfg(not(all(target_os = "android", target_arch = "x86")))]
    pub use libc::{user, user_fpregs_struct, user_regs_struct};

    // Not defined by libc on Android
    #[cfg(all(target_os = "android", target_arch = "x86"))]
    #[allow(non_camel_case_types)]
    #[repr(C)]
    pub struct user_regs_struct {
        pub ebx: libc::c_long,
        pub ecx: libc::c_long,
        pub edx: libc::c_long,
        pub esi: libc::c_long,
        pub edi: libc::c_long,
        pub ebp: libc::c_long,
        pub eax: libc::c_long,
        pub xds: libc::c_long,
        pub xes: libc::c_long,
        pub xfs: libc::c_long,
        pub xgs: libc::c_long,
        pub orig_eax: libc::c_long,
        pub eip: libc::c_long,
        pub xcs: libc::c_long,
        pub eflags: libc::c_long,
        pub esp: libc::c_long,
        pub xss: libc::c_long,
    }

    // Not defined by libc on Android
    #[cfg(all(target_os = "android", target_arch = "x86"))]
    #[allow(non_camel_case_types)]
    #[repr(C)]
    pub struct user_fpxregs_struct {
        pub cwd: libc::c_ushort,
        pub swd: libc::c_ushort,
        pub twd: libc::c_ushort,
        pub fop: libc::c_ushort,
        pub fip: libc::c_long,
        pub fcs: libc::c_long,
        pub foo: libc::c_long,
        pub fos: libc::c_long,
        pub mxcsr: libc::c_long,
        __reserved: libc::c_long,
        pub st_space: [libc::c_long; 32],
        pub xmm_space: [libc::c_long; 32],
        padding: [libc::c_long; 56],
    }

    // Not defined by libc on Android
    #[cfg(all(target_os = "android", target_arch = "x86"))]
    #[allow(non_camel_case_types)]
    #[repr(C)]
    pub struct user_fpregs_struct {
        pub cwd: libc::c_long,
        pub swd: libc::c_long,
        pub twd: libc::c_long,
        pub fip: libc::c_long,
        pub fcs: libc::c_long,
        pub foo: libc::c_long,
        pub fos: libc::c_long,
        pub st_space: [libc::c_long; 20],
    }

    #[cfg(all(target_os = "android", target_arch = "x86"))]
    #[allow(non_camel_case_types)]
    #[repr(C)]
    pub struct user {
        pub regs: user_regs_struct,
        pub u_fpvalid: libc::c_long,
        pub i387: user_fpregs_struct,
        pub u_tsize: libc::c_ulong,
        pub u_dsize: libc::c_ulong,
        pub u_ssize: libc::c_ulong,
        pub start_code: libc::c_ulong,
        pub start_stack: libc::c_ulong,
        pub signal: libc::c_long,
        __reserved: libc::c_int,
        pub u_ar0: *mut user_regs_struct,
        pub u_fpstate: *mut user_fpregs_struct,
        pub magic: libc::c_ulong,
        pub u_comm: [libc::c_char; 32],
        pub u_debugreg: [libc::c_int; 8],
    }
}