framehop/x86_64/
unwindregs.rs1use core::fmt::Debug;
2
3use crate::display_utils::HexNum;
4
5#[derive(Clone, Copy, PartialEq, Eq)]
6pub struct UnwindRegsX86_64 {
7 ip: u64,
8 regs: [u64; 16],
9}
10
11#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[repr(u8)]
13pub enum Reg {
14 RAX,
15 RDX,
16 RCX,
17 RBX,
18 RSI,
19 RDI,
20 RBP,
21 RSP,
22 R8,
23 R9,
24 R10,
25 R11,
26 R12,
27 R13,
28 R14,
29 R15,
30}
31
32impl UnwindRegsX86_64 {
33 pub fn new(ip: u64, sp: u64, bp: u64) -> Self {
34 let mut r = Self {
35 ip,
36 regs: Default::default(),
37 };
38 r.set_sp(sp);
39 r.set_bp(bp);
40 r
41 }
42
43 #[inline(always)]
44 pub fn get(&self, reg: Reg) -> u64 {
45 self.regs[reg as usize]
46 }
47 #[inline(always)]
48 pub fn set(&mut self, reg: Reg, value: u64) {
49 self.regs[reg as usize] = value;
50 }
51
52 #[inline(always)]
53 pub fn ip(&self) -> u64 {
54 self.ip
55 }
56 #[inline(always)]
57 pub fn set_ip(&mut self, ip: u64) {
58 self.ip = ip
59 }
60
61 #[inline(always)]
62 pub fn sp(&self) -> u64 {
63 self.get(Reg::RSP)
64 }
65 #[inline(always)]
66 pub fn set_sp(&mut self, sp: u64) {
67 self.set(Reg::RSP, sp)
68 }
69
70 #[inline(always)]
71 pub fn bp(&self) -> u64 {
72 self.get(Reg::RBP)
73 }
74 #[inline(always)]
75 pub fn set_bp(&mut self, bp: u64) {
76 self.set(Reg::RBP, bp)
77 }
78}
79
80impl Debug for UnwindRegsX86_64 {
81 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
82 f.debug_struct("UnwindRegsX86_64")
83 .field("ip", &HexNum(self.ip()))
84 .field("rax", &HexNum(self.get(Reg::RAX)))
85 .field("rdx", &HexNum(self.get(Reg::RDX)))
86 .field("rcx", &HexNum(self.get(Reg::RCX)))
87 .field("rbx", &HexNum(self.get(Reg::RBX)))
88 .field("rsi", &HexNum(self.get(Reg::RSI)))
89 .field("rdi", &HexNum(self.get(Reg::RDI)))
90 .field("rbp", &HexNum(self.get(Reg::RBP)))
91 .field("rsp", &HexNum(self.get(Reg::RSP)))
92 .field("r8", &HexNum(self.get(Reg::R8)))
93 .field("r9", &HexNum(self.get(Reg::R9)))
94 .field("r10", &HexNum(self.get(Reg::R10)))
95 .field("r11", &HexNum(self.get(Reg::R11)))
96 .field("r12", &HexNum(self.get(Reg::R12)))
97 .field("r13", &HexNum(self.get(Reg::R13)))
98 .field("r14", &HexNum(self.get(Reg::R14)))
99 .field("r15", &HexNum(self.get(Reg::R15)))
100 .finish()
101 }
102}