diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/architecture.py | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/python/architecture.py b/python/architecture.py index a6e1a083..ad295c91 100644 --- a/python/architecture.py +++ b/python/architecture.py @@ -122,6 +122,7 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): stack_pointer = None link_reg = None global_regs = [] + system_regs = [] flags = [] flag_write_types = [] semantic_flag_classes = [] @@ -194,6 +195,7 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): self._get_stack_pointer_register) self._cb.getLinkRegister = self._cb.getLinkRegister.__class__(self._get_link_register) self._cb.getGlobalRegisters = self._cb.getGlobalRegisters.__class__(self._get_global_registers) + self._cb.getSystemRegisters = self._cb.getSystemRegisters.__class__(self._get_system_registers) self._cb.getRegisterStackName = self._cb.getRegisterStackName.__class__(self._get_register_stack_name) self._cb.getAllRegisterStacks = self._cb.getAllRegisterStacks.__class__(self._get_all_register_stacks) self._cb.getRegisterStackInfo = self._cb.getRegisterStackInfo.__class__(self._get_register_stack_info) @@ -360,6 +362,7 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): self._semantic_class_for_flag_write_type[self._flag_write_types[write_type]] = sem_class_index self.__dict__["global_regs"] = self.__class__.global_regs + self.__dict__["system_regs"] = self.__class__.system_regs self._intrinsics = {} self._intrinsics_by_index = {} @@ -926,6 +929,20 @@ class Architecture(with_metaclass(_ArchitectureMetaClass, object)): count[0] = 0 return None + def _get_system_registers(self, ctxt, count): + try: + count[0] = len(self.system_regs) + reg_buf = (ctypes.c_uint * len(self.system_regs))() + for i in range(0, len(self.system_regs)): + reg_buf[i] = self._all_regs[self.system_regs[i]] + result = ctypes.cast(reg_buf, ctypes.c_void_p) + self._pending_reg_lists[result.value] = (result, reg_buf) + return result.value + except KeyError: + log.log_error(traceback.format_exc()) + count[0] = 0 + return None + def _get_register_stack_name(self, ctxt, reg_stack): try: if reg_stack in self._reg_stacks_by_index: @@ -2231,6 +2248,13 @@ class CoreArchitecture(Architecture): core.BNFreeRegisterList(regs) count = ctypes.c_ulonglong() + regs = core.BNGetArchitectureSystemRegisters(self.handle, count) + self.__dict__["system_regs"] = [] + for i in range(0, count.value): + self.system_regs.append(core.BNGetArchitectureRegisterName(self.handle, regs[i])) + core.BNFreeRegisterList(regs) + + count = ctypes.c_ulonglong() regs = core.BNGetAllArchitectureRegisterStacks(self.handle, count) self._all_reg_stacks = {} self._reg_stacks_by_index = {} @@ -2701,6 +2725,7 @@ class ArchitectureHook(CoreArchitecture): def register(self): self.__class__._registered_cb = self._cb self.handle = core.BNRegisterArchitectureHook(self._base_arch.handle, self._cb) + core.BNFinalizeArchitectureHook(self._base_arch.handle) @property def base_arch(self): |
