capstone_git/arch/
bpf.rs

1//! Contains bpf specific types
2
3use core::convert::From;
4use core::{cmp, fmt, slice};
5
6pub use capstone_sys::bpf_insn_group as BpfInsnGroup;
7pub use capstone_sys::bpf_insn as BpfInsn;
8pub use capstone_sys::bpf_reg as BpfReg;
9use capstone_sys::{cs_bpf, cs_bpf_op, bpf_op_mem, bpf_op_type};
10
11pub use crate::arch::arch_builder::bpf::*;
12use crate::arch::DetailsArchInsn;
13use crate::instruction::{RegId, RegIdInt};
14
15/// Contains BPF-specific details for an instruction
16pub struct BpfInsnDetail<'a>(pub(crate) &'a cs_bpf);
17
18impl_PartialEq_repr_fields!(BpfInsnDetail<'a> [ 'a ];
19    operands
20);
21
22/// BPF operand
23#[derive(Clone, Debug, Eq, PartialEq)]
24pub enum BpfOperand {
25    /// Register
26    Reg(RegId),
27
28    /// Immediate
29    Imm(u64),
30
31    /// Memory
32    Mem(BpfOpMem),
33
34    /// Offset
35    Off(u32),
36
37    /// Mmem
38    Mmem(u32),
39
40    /// Msh
41    Msh(u32),
42
43    /// Ext
44    Ext(u32),
45
46    /// Invalid
47    Invalid,
48}
49
50impl Default for BpfOperand {
51    fn default() -> Self {
52        BpfOperand::Invalid
53    }
54}
55
56
57/// Bpf memory operand
58#[derive(Debug, Copy, Clone)]
59pub struct BpfOpMem(pub(crate) bpf_op_mem);
60
61impl BpfOpMem {
62    /// Base register
63    pub fn base(&self) -> RegId {
64        RegId(self.0.base as RegIdInt)
65    }
66
67    /// Disp value
68    pub fn disp(&self) -> u32 {
69        self.0.disp
70    }
71}
72
73impl_PartialEq_repr_fields!(BpfOpMem;
74    base, disp
75);
76
77impl cmp::Eq for BpfOpMem {}
78
79impl From<&cs_bpf_op> for BpfOperand {
80    fn from(insn: &cs_bpf_op) -> BpfOperand {
81        match insn.type_ {
82            bpf_op_type::BPF_OP_EXT => BpfOperand::Ext(unsafe { insn.__bindgen_anon_1.ext }),
83            bpf_op_type::BPF_OP_INVALID => BpfOperand::Invalid,
84            bpf_op_type::BPF_OP_REG => BpfOperand::Reg(RegId(unsafe {insn.__bindgen_anon_1.reg} as RegIdInt)),
85            bpf_op_type::BPF_OP_IMM => BpfOperand::Imm(unsafe { insn.__bindgen_anon_1.imm }),
86            bpf_op_type::BPF_OP_MEM => BpfOperand::Mem(BpfOpMem(unsafe { insn.__bindgen_anon_1.mem})),
87            bpf_op_type::BPF_OP_OFF => BpfOperand::Off(unsafe { insn.__bindgen_anon_1.off }),
88            bpf_op_type::BPF_OP_MMEM => BpfOperand::Mmem(unsafe { insn.__bindgen_anon_1.mmem }),
89            bpf_op_type::BPF_OP_MSH => BpfOperand::Msh(unsafe { insn.__bindgen_anon_1.msh }),
90        }
91    }
92}
93
94def_arch_details_struct!(
95    InsnDetail = BpfInsnDetail;
96    Operand = BpfOperand;
97    OperandIterator = BpfOperandIterator;
98    OperandIteratorLife = BpfOperandIterator<'a>;
99    [ pub struct BpfOperandIterator<'a>(slice::Iter<'a, cs_bpf_op>); ]
100    cs_arch_op = cs_bpf_op;
101    cs_arch = cs_bpf;
102);