diff options
| author | Peter LaFosse <peter@vector35.com> | 2018-09-20 16:51:56 -0400 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2018-09-20 16:51:56 -0400 |
| commit | dd9a865f2ebcb4dfbe462154114f495e49a16fe4 (patch) | |
| tree | 9fffa7b1fa1c6b0f8c90dfad603fab7a07519852 /python/callingconvention.py | |
| parent | f48203de0acafb1d981d56c79d0edff921102065 (diff) | |
| parent | 536908c5d4ba2f919765b41a050269669c800a75 (diff) | |
Merge branch 'dev' into test_relocation
Diffstat (limited to 'python/callingconvention.py')
| -rw-r--r-- | python/callingconvention.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/python/callingconvention.py b/python/callingconvention.py index 6b906184..f4349816 100644 --- a/python/callingconvention.py +++ b/python/callingconvention.py @@ -34,6 +34,7 @@ from binaryninja import range class CallingConvention(object): name = None caller_saved_regs = [] + callee_saved_regs = [] int_arg_regs = [] float_arg_regs = [] arg_regs_share_index = False @@ -56,6 +57,7 @@ class CallingConvention(object): self._cb = core.BNCustomCallingConvention() self._cb.context = 0 self._cb.getCallerSavedRegisters = self._cb.getCallerSavedRegisters.__class__(self._get_caller_saved_regs) + self._cb.getCalleeSavedRegisters = self._cb.getCalleeSavedRegisters.__class__(self._get_callee_saved_regs) self._cb.getIntegerArgumentRegisters = self._cb.getIntegerArgumentRegisters.__class__(self._get_int_arg_regs) self._cb.getFloatArgumentRegisters = self._cb.getFloatArgumentRegisters.__class__(self._get_float_arg_regs) self._cb.freeRegisterList = self._cb.freeRegisterList.__class__(self._free_register_list) @@ -91,6 +93,15 @@ class CallingConvention(object): self.__dict__["caller_saved_regs"] = result count = ctypes.c_ulonglong() + regs = core.BNGetCalleeSavedRegisters(self.handle, count) + result = [] + arch = self.arch + for i in range(0, count.value): + result.append(arch.get_reg_name(regs[i])) + core.BNFreeRegisterList(regs, count.value) + self.__dict__["callee_saved_regs"] = result + + count = ctypes.c_ulonglong() regs = core.BNGetIntegerArgumentRegisters(self.handle, count) result = [] arch = self.arch @@ -171,6 +182,21 @@ class CallingConvention(object): count[0] = 0 return None + def _get_callee_saved_regs(self, ctxt, count): + try: + regs = self.__class__.callee_saved_regs + count[0] = len(regs) + reg_buf = (ctypes.c_uint * len(regs))() + for i in range(0, len(regs)): + reg_buf[i] = self.arch.regs[regs[i]].index + result = ctypes.cast(reg_buf, ctypes.c_void_p) + self._pending_reg_lists[result.value] = (result, reg_buf) + return result.value + except: + log.log_error(traceback.format_exc()) + count[0] = 0 + return None + def _get_int_arg_regs(self, ctxt, count): try: regs = self.__class__.int_arg_regs |
