From a0da07c5c2860a5bd69921d38e438bbc1d43912f Mon Sep 17 00:00:00 2001 From: Nick Shipp Date: Thu, 21 Jan 2021 18:31:50 +0000 Subject: arch: wrap new system registers API --- rust/src/architecture.rs | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'rust/src') diff --git a/rust/src/architecture.rs b/rust/src/architecture.rs index fc56140c..18dd5e82 100644 --- a/rust/src/architecture.rs +++ b/rust/src/architecture.rs @@ -439,6 +439,7 @@ pub trait Architecture: 'static + Sized + AsRef { fn registers_all(&self) -> Vec; fn registers_full_width(&self) -> Vec; fn registers_global(&self) -> Vec; + fn registers_system(&self) -> Vec; fn flags(&self) -> Vec; fn flag_write_types(&self) -> Vec; @@ -904,6 +905,22 @@ impl Architecture for CoreArchitecture { } } + fn registers_system(&self) -> Vec { + unsafe { + let mut count: usize = 0; + let regs = BNGetArchitectureSystemRegisters(self.0, &mut count as *mut _); + + let ret = slice::from_raw_parts_mut(regs, count) + .iter() + .map(|reg| CoreRegister(self.0, *reg)) + .collect(); + + BNFreeRegisterList(regs); + + ret + } + } + fn flags(&self) -> Vec { unsafe { let mut count: usize = 0; @@ -1375,6 +1392,16 @@ where alloc_register_list(regs.iter().map(|r| r.id()), unsafe { &mut *count }) } + extern "C" fn cb_registers_system(ctxt: *mut c_void, count: *mut usize) -> *mut u32 + where + A: 'static + Architecture> + Send + Sync, + { + let custom_arch = unsafe { &*(ctxt as *mut A) }; + let regs = custom_arch.registers_system(); + + alloc_register_list(regs.iter().map(|r| r.id()), unsafe { &mut *count }) + } + extern "C" fn cb_flags(ctxt: *mut c_void, count: *mut usize) -> *mut u32 where A: 'static + Architecture> + Send + Sync, @@ -1808,6 +1835,7 @@ where getStackPointerRegister: Some(cb_stack_pointer::), getLinkRegister: Some(cb_link_reg::), getGlobalRegisters: Some(cb_registers_global::), + getSystemRegisters: Some(cb_registers_system::), getRegisterStackName: Some(cb_reg_stack_name::), getAllRegisterStacks: Some(cb_reg_stacks::), -- cgit v1.3.1