Skip to main content

process_backend/
regs.rs

1pub use imp::*;
2
3#[cfg(target_arch = "aarch64")]
4mod imp {
5    pub type GenRegs = libc::user_regs_struct;
6    pub type FpRegs = user_fpsimd_struct;
7
8    /// https://github.com/rust-lang/libc/pull/2719
9    #[repr(C)]
10    #[derive(Debug)]
11    pub struct user_fpsimd_struct {
12        pub vregs: [u128; 32],
13        pub fpsr: u32,
14        pub fpcr: u32,
15    }
16}
17
18#[cfg(target_arch = "arm")]
19mod imp {
20    pub type GenRegs = user_regs_struct;
21    pub type FpRegs = user_fpregs_struct;
22
23    // Not defined by libc because this works only for cores support VFP
24    #[repr(C)]
25    #[derive(Debug, Eq, Hash, PartialEq, Copy, Clone, Default)]
26    pub struct user_fpregs_struct {
27        pub fpregs: [u64; 32],
28        pub fpscr: u32,
29    }
30
31    #[repr(C)]
32    #[derive(Debug, Eq, Hash, PartialEq, Copy, Clone, Default)]
33    pub struct user_regs_struct {
34        pub uregs: [u32; 18],
35    }
36}
37
38#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
39mod imp {
40    pub type GenRegs = user_regs_struct;
41    pub type FpRegs = user_fpregs_struct;
42
43    #[cfg(target_arch = "x86")]
44    pub type FpxRegs = user_fpxregs_struct;
45
46    pub const NUM_DEBUG_REGISTERS: usize = 8;
47
48    #[cfg(target_arch = "x86")]
49    pub type RegType = u32;
50
51    #[cfg(target_arch = "x86_64")]
52    pub type RegType = u64;
53
54    #[cfg(all(not(target_os = "android"), target_arch = "x86"))]
55    pub use libc::user_fpxregs_struct;
56    #[cfg(not(all(target_os = "android", target_arch = "x86")))]
57    pub use libc::{user, user_fpregs_struct, user_regs_struct};
58
59    // Not defined by libc on Android
60    #[cfg(all(target_os = "android", target_arch = "x86"))]
61    #[allow(non_camel_case_types)]
62    #[repr(C)]
63    pub struct user_regs_struct {
64        pub ebx: libc::c_long,
65        pub ecx: libc::c_long,
66        pub edx: libc::c_long,
67        pub esi: libc::c_long,
68        pub edi: libc::c_long,
69        pub ebp: libc::c_long,
70        pub eax: libc::c_long,
71        pub xds: libc::c_long,
72        pub xes: libc::c_long,
73        pub xfs: libc::c_long,
74        pub xgs: libc::c_long,
75        pub orig_eax: libc::c_long,
76        pub eip: libc::c_long,
77        pub xcs: libc::c_long,
78        pub eflags: libc::c_long,
79        pub esp: libc::c_long,
80        pub xss: libc::c_long,
81    }
82
83    // Not defined by libc on Android
84    #[cfg(all(target_os = "android", target_arch = "x86"))]
85    #[allow(non_camel_case_types)]
86    #[repr(C)]
87    pub struct user_fpxregs_struct {
88        pub cwd: libc::c_ushort,
89        pub swd: libc::c_ushort,
90        pub twd: libc::c_ushort,
91        pub fop: libc::c_ushort,
92        pub fip: libc::c_long,
93        pub fcs: libc::c_long,
94        pub foo: libc::c_long,
95        pub fos: libc::c_long,
96        pub mxcsr: libc::c_long,
97        __reserved: libc::c_long,
98        pub st_space: [libc::c_long; 32],
99        pub xmm_space: [libc::c_long; 32],
100        padding: [libc::c_long; 56],
101    }
102
103    // Not defined by libc on Android
104    #[cfg(all(target_os = "android", target_arch = "x86"))]
105    #[allow(non_camel_case_types)]
106    #[repr(C)]
107    pub struct user_fpregs_struct {
108        pub cwd: libc::c_long,
109        pub swd: libc::c_long,
110        pub twd: libc::c_long,
111        pub fip: libc::c_long,
112        pub fcs: libc::c_long,
113        pub foo: libc::c_long,
114        pub fos: libc::c_long,
115        pub st_space: [libc::c_long; 20],
116    }
117
118    #[cfg(all(target_os = "android", target_arch = "x86"))]
119    #[allow(non_camel_case_types)]
120    #[repr(C)]
121    pub struct user {
122        pub regs: user_regs_struct,
123        pub u_fpvalid: libc::c_long,
124        pub i387: user_fpregs_struct,
125        pub u_tsize: libc::c_ulong,
126        pub u_dsize: libc::c_ulong,
127        pub u_ssize: libc::c_ulong,
128        pub start_code: libc::c_ulong,
129        pub start_stack: libc::c_ulong,
130        pub signal: libc::c_long,
131        __reserved: libc::c_int,
132        pub u_ar0: *mut user_regs_struct,
133        pub u_fpstate: *mut user_fpregs_struct,
134        pub magic: libc::c_ulong,
135        pub u_comm: [libc::c_char; 32],
136        pub u_debugreg: [libc::c_int; 8],
137    }
138}