Skip to main content

libsla_sys/
rust.rs

1use super::api;
2use super::sys;
3pub use cxx::{CxxString, CxxVector};
4
5pub struct RustAssemblyEmit<'a>(pub &'a mut dyn api::AssemblyEmit);
6
7impl<'a> RustAssemblyEmit<'a> {
8    pub fn dump(&mut self, address: &sys::Address, mnemonic: &CxxString, body: &CxxString) {
9        self.0.dump(address, mnemonic, body);
10    }
11}
12
13pub struct RustLoadImage<'a>(pub &'a dyn api::LoadImage);
14
15impl<'a> RustLoadImage<'a> {
16    /// * `ptr` must have `len` elements and be safe to dereference if `len > 0`
17    ///
18    /// # Safety
19    ///
20    /// `ptr` must be an array of mutable bytes of length `len`
21    pub unsafe fn load_fill(
22        &self,
23        ptr: *mut u8,
24        len: i32,
25        addr: &sys::Address,
26    ) -> Result<(), String> {
27        let buffer = unsafe { std::slice::from_raw_parts_mut(ptr, len as usize) };
28        self.0.load_fill(buffer, addr)
29    }
30}
31
32pub struct RustPcodeEmit<'a>(pub &'a mut dyn api::PcodeEmit);
33
34impl<'a> RustPcodeEmit<'a> {
35    /// # Safety
36    /// * `output` must be safe to dereference if non-null. Note that this value MAY be null.
37    pub unsafe fn dump(
38        &mut self,
39        addr: &sys::Address,
40        op_code: sys::OpCode,
41        output: *mut sys::VarnodeData, // TODO make const?
42        inputs: &CxxVector<sys::VarnodeData>,
43    ) {
44        let output = if !output.is_null() {
45            unsafe { Some(&*output) }
46        } else {
47            None
48        };
49
50        self.0.dump(addr, op_code, output, inputs);
51    }
52}