framehop/x86_64/
unwindregs.rs

1use 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}