@@ -40,6 +40,8 @@ class CallingConvention:
4040 callee_saved_regs = []
4141 int_arg_regs = []
4242 float_arg_regs = []
43+ required_arg_regs = []
44+ required_clobbered_regs = []
4345 arg_regs_share_index = False
4446 arg_regs_for_varargs = True
4547 stack_reserved_for_arg_regs = False
@@ -70,6 +72,12 @@ def __init__(
7072 self ._get_int_arg_regs
7173 )
7274 self ._cb .getFloatArgumentRegisters = self ._cb .getFloatArgumentRegisters .__class__ (self ._get_float_arg_regs )
75+ self ._cb .getRequiredArgumentRegisters = self ._cb .getRequiredArgumentRegisters .__class__ (
76+ self ._get_required_arg_regs
77+ )
78+ self ._cb .getRequiredClobberedRegisters = self ._cb .getRequiredClobberedRegisters .__class__ (
79+ self ._get_required_clobbered_regs
80+ )
7381 self ._cb .freeRegisterList = self ._cb .freeRegisterList .__class__ (self ._free_register_list )
7482 self ._cb .areArgumentRegistersSharedIndex = self ._cb .areArgumentRegistersSharedIndex .__class__ (
7583 self ._arg_regs_share_index
@@ -161,6 +169,26 @@ def __init__(
161169 core .BNFreeRegisterList (regs )
162170 self .__dict__ ["float_arg_regs" ] = result
163171
172+ count = ctypes .c_ulonglong ()
173+ regs = core .BNGetRequiredArgumentRegisters (handle , count )
174+ assert regs is not None , "core.BNGetRequiredArgumentRegisters returned None"
175+ result = []
176+ arch = self .arch
177+ for i in range (0 , count .value ):
178+ result .append (arch .get_reg_name (regs [i ]))
179+ core .BNFreeRegisterList (regs )
180+ self .__dict__ ["required_arg_regs" ] = result
181+
182+ count = ctypes .c_ulonglong ()
183+ regs = core .BNGetRequiredClobberedRegisters (handle , count )
184+ assert regs is not None , "core.BNGetRequiredClobberedRegisters returned None"
185+ result = []
186+ arch = self .arch
187+ for i in range (0 , count .value ):
188+ result .append (arch .get_reg_name (regs [i ]))
189+ core .BNFreeRegisterList (regs )
190+ self .__dict__ ["required_clobbered_regs" ] = result
191+
164192 reg = core .BNGetIntegerReturnValueRegister (_handle )
165193 if reg == 0xffffffff :
166194 self .__dict__ ["int_return_reg" ] = None
@@ -281,6 +309,36 @@ def _get_float_arg_regs(self, ctxt, count):
281309 count [0 ] = 0
282310 return None
283311
312+ def _get_required_arg_regs (self , ctxt , count ):
313+ try :
314+ regs = self .__class__ .required_arg_regs
315+ count [0 ] = len (regs )
316+ reg_buf = (ctypes .c_uint * len (regs ))()
317+ for i in range (0 , len (regs )):
318+ reg_buf [i ] = self .arch .regs [regs [i ]].index
319+ result = ctypes .cast (reg_buf , ctypes .c_void_p )
320+ self ._pending_reg_lists [result .value ] = (result , reg_buf )
321+ return result .value
322+ except :
323+ log_error_for_exception ("Unhandled Python exception in CallingConvention._get_required_arg_regs" )
324+ count [0 ] = 0
325+ return None
326+
327+ def _get_required_clobbered_regs (self , ctxt , count ):
328+ try :
329+ regs = self .__class__ .required_clobbered_regs
330+ count [0 ] = len (regs )
331+ reg_buf = (ctypes .c_uint * len (regs ))()
332+ for i in range (0 , len (regs )):
333+ reg_buf [i ] = self .arch .regs [regs [i ]].index
334+ result = ctypes .cast (reg_buf , ctypes .c_void_p )
335+ self ._pending_reg_lists [result .value ] = (result , reg_buf )
336+ return result .value
337+ except :
338+ log_error_for_exception ("Unhandled Python exception in CallingConvention._get_required_clobbered_regs" )
339+ count [0 ] = 0
340+ return None
341+
284342 def _free_register_list (self , ctxt , regs , count ):
285343 try :
286344 buf = ctypes .cast (regs , ctypes .c_void_p )
0 commit comments