diff options
author | iximeow <me@iximeow.net> | 2020-01-12 15:03:09 -0800 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2020-01-12 16:10:14 -0800 |
commit | 825eabe868163189d371901ecfe27b4a3d0c9e97 (patch) | |
tree | f6240281710fe5971a7b28de3f3277402bd6eb0f /ffi/src/lib.rs | |
parent | b7b781db7a2ba94c816ff5138a713114c39d4034 (diff) |
add *extremely* poor ffi bindings for x86 decoders
this is specifically to support a disas-bench integration, for now
Diffstat (limited to 'ffi/src/lib.rs')
-rw-r--r-- | ffi/src/lib.rs | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/ffi/src/lib.rs b/ffi/src/lib.rs new file mode 100644 index 0000000..12e077b --- /dev/null +++ b/ffi/src/lib.rs @@ -0,0 +1,43 @@ +use yaxpeax_arch::{Arch, Decoder, LengthedInstruction, Address}; +use yaxpeax_x86::x86_64; + +use std::fmt::Write; + +#[no_mangle] +pub unsafe extern "C" fn yaxpeax_decode_x86_64_optimistic(data: *const std::os::raw::c_char, length: std::os::raw::c_longlong, inst: *mut yaxpeax_x86::Instruction) -> bool { + let inst: &mut yaxpeax_x86::Instruction = std::mem::transmute(inst); + <x86_64 as Arch>::Decoder::default().decode_into(inst, std::slice::from_raw_parts(data as *const u8, length as usize).iter().cloned()).is_err() +} + +#[no_mangle] +pub unsafe extern "C" fn yaxpeax_instr_length_x86_64(inst: *mut yaxpeax_x86::Instruction) -> usize { + let inst: &mut yaxpeax_x86::Instruction = std::mem::transmute(inst); + inst.len().to_linear() +} + +#[no_mangle] +pub unsafe extern "C" fn yaxpeax_instr_fmt(inst: *mut yaxpeax_x86::Instruction, size: *mut u64, capacity: *mut u64) -> *mut u8 { + let inst: &mut yaxpeax_x86::Instruction = std::mem::transmute(inst); + let mut res = String::with_capacity(128); + + write!(res, "{}", inst).unwrap(); + + let mut bytes = res.into_bytes(); + let ptr = bytes.as_mut_ptr(); + *capacity = bytes.capacity() as u64; + *size = bytes.len() as u64; + std::mem::forget(bytes); + ptr +} + +#[no_mangle] +pub unsafe extern "C" fn yaxpeax_instr_x86_64_blank() -> *mut yaxpeax_x86::Instruction { + Box::leak(Box::new(yaxpeax_x86::Instruction::invalid())) +} + +#[no_mangle] +pub unsafe extern "C" fn yaxpeax_str_drop(data: *mut u8, size: u64, capacity: u64) { + std::mem::drop( + Vec::from_raw_parts(data, size as usize, capacity as usize) + ); +} |