diff options
| -rw-r--r-- | rust/src/architecture.rs | 28 |
1 files changed, 28 insertions, 0 deletions
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<CoreArchitecture> { fn registers_all(&self) -> Vec<Self::Register>; fn registers_full_width(&self) -> Vec<Self::Register>; fn registers_global(&self) -> Vec<Self::Register>; + fn registers_system(&self) -> Vec<Self::Register>; fn flags(&self) -> Vec<Self::Flag>; fn flag_write_types(&self) -> Vec<Self::FlagWrite>; @@ -904,6 +905,22 @@ impl Architecture for CoreArchitecture { } } + fn registers_system(&self) -> Vec<CoreRegister> { + 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<CoreFlag> { 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<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32 + where + A: 'static + Architecture<Handle=CustomArchitectureHandle<A>> + 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<A>(ctxt: *mut c_void, count: *mut usize) -> *mut u32 where A: 'static + Architecture<Handle=CustomArchitectureHandle<A>> + Send + Sync, @@ -1808,6 +1835,7 @@ where getStackPointerRegister: Some(cb_stack_pointer::<A>), getLinkRegister: Some(cb_link_reg::<A>), getGlobalRegisters: Some(cb_registers_global::<A>), + getSystemRegisters: Some(cb_registers_system::<A>), getRegisterStackName: Some(cb_reg_stack_name::<A>), getAllRegisterStacks: Some(cb_reg_stacks::<A>), |
