Home | History | Annotate | Download | only in capstone
      1 # Capstone Python bindings, by Nguyen Anh Quynnh <aquynh (at] gmail.com>
      2 
      3 import ctypes
      4 from . import copy_ctypes_list
      5 from .arm_const import *
      6 
      7 # define the API
      8 class ArmOpMem(ctypes.Structure):
      9     _fields_ = (
     10         ('base', ctypes.c_uint),
     11         ('index', ctypes.c_uint),
     12         ('scale', ctypes.c_int),
     13         ('disp', ctypes.c_int),
     14     )
     15 
     16 class ArmOpShift(ctypes.Structure):
     17     _fields_ = (
     18         ('type', ctypes.c_uint),
     19         ('value', ctypes.c_uint),
     20     )
     21 
     22 class ArmOpValue(ctypes.Union):
     23     _fields_ = (
     24         ('reg', ctypes.c_uint),
     25         ('imm', ctypes.c_int32),
     26         ('fp', ctypes.c_double),
     27         ('mem', ArmOpMem),
     28         ('setend', ctypes.c_int),
     29     )
     30 
     31 class ArmOp(ctypes.Structure):
     32     _fields_ = (
     33         ('vector_index', ctypes.c_int),
     34         ('shift', ArmOpShift),
     35         ('type', ctypes.c_uint),
     36         ('value', ArmOpValue),
     37         ('subtracted', ctypes.c_bool),
     38     )
     39 
     40     @property
     41     def imm(self):
     42         return self.value.imm
     43 
     44     @property
     45     def reg(self):
     46         return self.value.reg
     47 
     48     @property
     49     def fp(self):
     50         return self.value.fp
     51 
     52     @property
     53     def mem(self):
     54         return self.value.mem
     55 
     56     @property
     57     def setend(self):
     58         return self.value.setend
     59 
     60 
     61 class CsArm(ctypes.Structure):
     62     _fields_ = (
     63         ('usermode', ctypes.c_bool),
     64         ('vector_size', ctypes.c_int),
     65         ('vector_data', ctypes.c_int),
     66         ('cps_mode', ctypes.c_int),
     67         ('cps_flag', ctypes.c_int),
     68         ('cc', ctypes.c_uint),
     69         ('update_flags', ctypes.c_bool),
     70         ('writeback', ctypes.c_bool),
     71         ('mem_barrier', ctypes.c_int),
     72         ('op_count', ctypes.c_uint8),
     73         ('operands', ArmOp * 36),
     74     )
     75 
     76 def get_arch_info(a):
     77     return (a.usermode, a.vector_size, a.vector_data, a.cps_mode, a.cps_flag, a.cc, a.update_flags, \
     78         a.writeback, a.mem_barrier, copy_ctypes_list(a.operands[:a.op_count]))
     79 
     80