• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Capstone Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
2
3import ctypes
4from . import copy_ctypes_list
5from .arm64_const import *
6
7# define the API
8class Arm64OpMem(ctypes.Structure):
9    _fields_ = (
10        ('base', ctypes.c_uint),
11        ('index', ctypes.c_uint),
12        ('disp', ctypes.c_int32),
13    )
14
15class Arm64OpShift(ctypes.Structure):
16    _fields_ = (
17        ('type', ctypes.c_uint),
18        ('value', ctypes.c_uint),
19    )
20
21class Arm64OpValue(ctypes.Union):
22    _fields_ = (
23        ('reg', ctypes.c_uint),
24        ('imm', ctypes.c_int64),
25        ('fp', ctypes.c_double),
26        ('mem', Arm64OpMem),
27        ('pstate', ctypes.c_int),
28        ('sys', ctypes.c_uint),
29        ('prefetch', ctypes.c_int),
30        ('barrier', ctypes.c_int),
31    )
32
33class Arm64Op(ctypes.Structure):
34    _fields_ = (
35        ('vector_index', ctypes.c_int),
36        ('vas', ctypes.c_int),
37        ('vess', ctypes.c_int),
38        ('shift', Arm64OpShift),
39        ('ext', ctypes.c_uint),
40        ('type', ctypes.c_uint),
41        ('value', Arm64OpValue),
42        ('access', ctypes.c_uint8),
43    )
44
45    @property
46    def imm(self):
47        return self.value.imm
48
49    @property
50    def reg(self):
51        return self.value.reg
52
53    @property
54    def fp(self):
55        return self.value.fp
56
57    @property
58    def mem(self):
59        return self.value.mem
60
61    @property
62    def pstate(self):
63        return self.value.pstate
64
65    @property
66    def sys(self):
67        return self.value.sys
68
69    @property
70    def prefetch(self):
71        return self.value.prefetch
72
73    @property
74    def barrier(self):
75        return self.value.barrier
76
77
78
79class CsArm64(ctypes.Structure):
80    _fields_ = (
81        ('cc', ctypes.c_uint),
82        ('update_flags', ctypes.c_bool),
83        ('writeback', ctypes.c_bool),
84        ('op_count', ctypes.c_uint8),
85        ('operands', Arm64Op * 8),
86    )
87
88def get_arch_info(a):
89    return (a.cc, a.update_flags, a.writeback, copy_ctypes_list(a.operands[:a.op_count]))
90
91