1use tracing::warn;
6
7pub mod pt_regs_indices {
13 use aya_ebpf_bindings::bindings::pt_regs;
14
15 const U64_SIZE: usize = core::mem::size_of::<u64>();
17
18 pub const R15: usize = core::mem::offset_of!(pt_regs, r15) / U64_SIZE;
20 pub const R14: usize = core::mem::offset_of!(pt_regs, r14) / U64_SIZE;
21 pub const R13: usize = core::mem::offset_of!(pt_regs, r13) / U64_SIZE;
22 pub const R12: usize = core::mem::offset_of!(pt_regs, r12) / U64_SIZE;
23 pub const RBP: usize = core::mem::offset_of!(pt_regs, rbp) / U64_SIZE; pub const RBX: usize = core::mem::offset_of!(pt_regs, rbx) / U64_SIZE;
25 pub const R11: usize = core::mem::offset_of!(pt_regs, r11) / U64_SIZE;
26 pub const R10: usize = core::mem::offset_of!(pt_regs, r10) / U64_SIZE;
27 pub const R9: usize = core::mem::offset_of!(pt_regs, r9) / U64_SIZE;
28 pub const R8: usize = core::mem::offset_of!(pt_regs, r8) / U64_SIZE;
29 pub const RAX: usize = core::mem::offset_of!(pt_regs, rax) / U64_SIZE; pub const RCX: usize = core::mem::offset_of!(pt_regs, rcx) / U64_SIZE; pub const RDX: usize = core::mem::offset_of!(pt_regs, rdx) / U64_SIZE; pub const RSI: usize = core::mem::offset_of!(pt_regs, rsi) / U64_SIZE; pub const RDI: usize = core::mem::offset_of!(pt_regs, rdi) / U64_SIZE; pub const ORIG_RAX: usize = core::mem::offset_of!(pt_regs, orig_rax) / U64_SIZE; pub const RIP: usize = core::mem::offset_of!(pt_regs, rip) / U64_SIZE; pub const CS: usize = core::mem::offset_of!(pt_regs, cs) / U64_SIZE; pub const EFLAGS: usize = core::mem::offset_of!(pt_regs, eflags) / U64_SIZE; pub const RSP: usize = core::mem::offset_of!(pt_regs, rsp) / U64_SIZE; pub const SS: usize = core::mem::offset_of!(pt_regs, ss) / U64_SIZE; }
43
44pub fn dwarf_reg_to_pt_regs_byte_offset_x86_64(dwarf_reg: u16) -> Option<usize> {
77 const U64_SIZE: usize = core::mem::size_of::<u64>();
78 match dwarf_reg {
79 0 => Some(pt_regs_indices::RAX * U64_SIZE), 1 => Some(pt_regs_indices::RDX * U64_SIZE), 2 => Some(pt_regs_indices::RCX * U64_SIZE), 3 => Some(pt_regs_indices::RBX * U64_SIZE), 4 => Some(pt_regs_indices::RSI * U64_SIZE), 5 => Some(pt_regs_indices::RDI * U64_SIZE), 6 => Some(pt_regs_indices::RBP * U64_SIZE), 7 => Some(pt_regs_indices::RSP * U64_SIZE), 8 => Some(pt_regs_indices::R8 * U64_SIZE), 9 => Some(pt_regs_indices::R9 * U64_SIZE), 10 => Some(pt_regs_indices::R10 * U64_SIZE), 11 => Some(pt_regs_indices::R11 * U64_SIZE), 12 => Some(pt_regs_indices::R12 * U64_SIZE), 13 => Some(pt_regs_indices::R13 * U64_SIZE), 14 => Some(pt_regs_indices::R14 * U64_SIZE), 15 => Some(pt_regs_indices::R15 * U64_SIZE), 16 => Some(pt_regs_indices::RIP * U64_SIZE), _ => {
98 warn!("Unknown DWARF register {} for x86_64", dwarf_reg);
99 None
100 }
101 }
102}
103
104pub fn dwarf_reg_to_name_x86_64(dwarf_reg: u16) -> Option<&'static str> {
109 match dwarf_reg {
110 0 => Some("RAX"), 1 => Some("RDX"), 2 => Some("RCX"), 3 => Some("RBX"), 4 => Some("RSI"), 5 => Some("RDI"), 6 => Some("RBP"), 7 => Some("RSP"), 8 => Some("R8"), 9 => Some("R9"), 10 => Some("R10"), 11 => Some("R11"), 12 => Some("R12"), 13 => Some("R13"), 14 => Some("R14"), 15 => Some("R15"), 16 => Some("RIP"), 17 => Some("XMM0"),
128 18 => Some("XMM1"),
129 19 => Some("XMM2"),
130 20 => Some("XMM3"),
131 21 => Some("XMM4"),
132 22 => Some("XMM5"),
133 23 => Some("XMM6"),
134 24 => Some("XMM7"),
135 25 => Some("XMM8"),
136 26 => Some("XMM9"),
137 27 => Some("XMM10"),
138 28 => Some("XMM11"),
139 29 => Some("XMM12"),
140 30 => Some("XMM13"),
141 31 => Some("XMM14"),
142 32 => Some("XMM15"),
143 _ => None,
144 }
145}
146
147pub fn dwarf_reg_to_name(dwarf_reg: u16) -> Option<&'static str> {
152 dwarf_reg_to_name_x86_64(dwarf_reg)
155}
156
157pub fn dwarf_reg_to_pt_regs_byte_offset(dwarf_reg: u16) -> Option<usize> {
162 dwarf_reg_to_pt_regs_byte_offset_x86_64(dwarf_reg)
165}
166
167#[cfg(test)]
168mod tests {
169 use super::*;
170
171 #[test]
172 fn test_x86_64_dwarf_to_pt_regs_mapping() {
173 assert_eq!(dwarf_reg_to_pt_regs_byte_offset_x86_64(0), Some(80)); assert_eq!(dwarf_reg_to_pt_regs_byte_offset_x86_64(6), Some(32)); assert_eq!(dwarf_reg_to_pt_regs_byte_offset_x86_64(7), Some(152)); assert_eq!(dwarf_reg_to_pt_regs_byte_offset_x86_64(16), Some(128)); assert_eq!(dwarf_reg_to_pt_regs_byte_offset_x86_64(17), None); assert_eq!(dwarf_reg_to_pt_regs_byte_offset_x86_64(99), None);
182 }
183
184 #[test]
185 fn test_x86_64_dwarf_to_name_mapping() {
186 assert_eq!(dwarf_reg_to_name_x86_64(0), Some("RAX"));
188 assert_eq!(dwarf_reg_to_name_x86_64(1), Some("RDX"));
189 assert_eq!(dwarf_reg_to_name_x86_64(4), Some("RSI"));
190 assert_eq!(dwarf_reg_to_name_x86_64(5), Some("RDI"));
191 assert_eq!(dwarf_reg_to_name_x86_64(6), Some("RBP"));
192 assert_eq!(dwarf_reg_to_name_x86_64(7), Some("RSP"));
193
194 assert_eq!(dwarf_reg_to_name_x86_64(8), Some("R8"));
196 assert_eq!(dwarf_reg_to_name_x86_64(13), Some("R13"));
197 assert_eq!(dwarf_reg_to_name_x86_64(15), Some("R15"));
198
199 assert_eq!(dwarf_reg_to_name_x86_64(16), Some("RIP"));
201 assert_eq!(dwarf_reg_to_name_x86_64(17), Some("XMM0"));
202 assert_eq!(dwarf_reg_to_name_x86_64(32), Some("XMM15"));
203
204 assert_eq!(dwarf_reg_to_name_x86_64(99), None);
206 }
207
208 #[test]
209 fn test_dwarf_reg_to_name_generic() {
210 assert_eq!(dwarf_reg_to_name(0), Some("RAX"));
212 assert_eq!(dwarf_reg_to_name(5), Some("RDI"));
213 assert_eq!(dwarf_reg_to_name(13), Some("R13"));
214 assert_eq!(dwarf_reg_to_name(99), None);
215 }
216
217 #[test]
218 fn test_dwarf_reg_to_pt_regs_byte_offset_generic() {
219 assert_eq!(dwarf_reg_to_pt_regs_byte_offset(0), Some(80)); assert_eq!(dwarf_reg_to_pt_regs_byte_offset(5), Some(112)); assert_eq!(dwarf_reg_to_pt_regs_byte_offset(99), None);
223 }
224}