1*9a0e4156SSadaf Ebrahimi# Capstone Python bindings, by Fotis Loukos <[email protected]> 2*9a0e4156SSadaf Ebrahimi 3*9a0e4156SSadaf Ebrahimiimport ctypes, copy 4*9a0e4156SSadaf Ebrahimifrom .tms320c64x_const import * 5*9a0e4156SSadaf Ebrahimi 6*9a0e4156SSadaf Ebrahimi# define the API 7*9a0e4156SSadaf Ebrahimiclass TMS320C64xOpMem(ctypes.Structure): 8*9a0e4156SSadaf Ebrahimi _fields_ = ( 9*9a0e4156SSadaf Ebrahimi ('base', ctypes.c_int), 10*9a0e4156SSadaf Ebrahimi ('disp', ctypes.c_int), 11*9a0e4156SSadaf Ebrahimi ('unit', ctypes.c_int), 12*9a0e4156SSadaf Ebrahimi ('scaled', ctypes.c_int), 13*9a0e4156SSadaf Ebrahimi ('disptype', ctypes.c_int), 14*9a0e4156SSadaf Ebrahimi ('direction', ctypes.c_int), 15*9a0e4156SSadaf Ebrahimi ('modify', ctypes.c_int), 16*9a0e4156SSadaf Ebrahimi ) 17*9a0e4156SSadaf Ebrahimi 18*9a0e4156SSadaf Ebrahimiclass TMS320C64xOpValue(ctypes.Union): 19*9a0e4156SSadaf Ebrahimi _fields_ = ( 20*9a0e4156SSadaf Ebrahimi ('reg', ctypes.c_uint), 21*9a0e4156SSadaf Ebrahimi ('imm', ctypes.c_int32), 22*9a0e4156SSadaf Ebrahimi ('mem', TMS320C64xOpMem), 23*9a0e4156SSadaf Ebrahimi ) 24*9a0e4156SSadaf Ebrahimi 25*9a0e4156SSadaf Ebrahimiclass TMS320C64xCondition(ctypes.Structure): 26*9a0e4156SSadaf Ebrahimi _fields_ = ( 27*9a0e4156SSadaf Ebrahimi ('reg', ctypes.c_uint), 28*9a0e4156SSadaf Ebrahimi ('zero', ctypes.c_uint), 29*9a0e4156SSadaf Ebrahimi ) 30*9a0e4156SSadaf Ebrahimi 31*9a0e4156SSadaf Ebrahimiclass TMS320C64xFunctionalUnit(ctypes.Structure): 32*9a0e4156SSadaf Ebrahimi _fields_ = ( 33*9a0e4156SSadaf Ebrahimi ('unit', ctypes.c_uint), 34*9a0e4156SSadaf Ebrahimi ('side', ctypes.c_uint), 35*9a0e4156SSadaf Ebrahimi ('crosspath', ctypes.c_uint), 36*9a0e4156SSadaf Ebrahimi ) 37*9a0e4156SSadaf Ebrahimi 38*9a0e4156SSadaf Ebrahimiclass TMS320C64xOp(ctypes.Structure): 39*9a0e4156SSadaf Ebrahimi _fields_ = ( 40*9a0e4156SSadaf Ebrahimi ('type', ctypes.c_uint), 41*9a0e4156SSadaf Ebrahimi ('value', TMS320C64xOpValue), 42*9a0e4156SSadaf Ebrahimi ) 43*9a0e4156SSadaf Ebrahimi 44*9a0e4156SSadaf Ebrahimi @property 45*9a0e4156SSadaf Ebrahimi def imm(self): 46*9a0e4156SSadaf Ebrahimi return self.value.imm 47*9a0e4156SSadaf Ebrahimi 48*9a0e4156SSadaf Ebrahimi @property 49*9a0e4156SSadaf Ebrahimi def reg(self): 50*9a0e4156SSadaf Ebrahimi return self.value.reg 51*9a0e4156SSadaf Ebrahimi 52*9a0e4156SSadaf Ebrahimi @property 53*9a0e4156SSadaf Ebrahimi def mem(self): 54*9a0e4156SSadaf Ebrahimi return self.value.mem 55*9a0e4156SSadaf Ebrahimi 56*9a0e4156SSadaf Ebrahimiclass CsTMS320C64x(ctypes.Structure): 57*9a0e4156SSadaf Ebrahimi _fields_ = ( 58*9a0e4156SSadaf Ebrahimi ('op_count', ctypes.c_uint8), 59*9a0e4156SSadaf Ebrahimi ('operands', TMS320C64xOp * 8), 60*9a0e4156SSadaf Ebrahimi ('condition', TMS320C64xCondition), 61*9a0e4156SSadaf Ebrahimi ('funit', TMS320C64xFunctionalUnit), 62*9a0e4156SSadaf Ebrahimi ('parallel', ctypes.c_uint), 63*9a0e4156SSadaf Ebrahimi ) 64*9a0e4156SSadaf Ebrahimi 65*9a0e4156SSadaf Ebrahimidef get_arch_info(a): 66*9a0e4156SSadaf Ebrahimi return (a.condition, a.funit, a.parallel, copy.deepcopy(a.operands[:a.op_count])) 67