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    )
43
44    @property
45    def imm(self):
46        return self.value.imm
47
48    @property
49    def reg(self):
50        return self.value.reg
51
52    @property
53    def fp(self):
54        return self.value.fp
55
56    @property
57    def mem(self):
58        return self.value.mem
59
60    @property
61    def pstate(self):
62        return self.value.pstate
63
64    @property
65    def sys(self):
66        return self.value.sys
67
68    @property
69    def prefetch(self):
70        return self.value.prefetch
71
72    @property
73    def barrier(self):
74        return self.value.barrier
75
76
77
78class CsArm64(ctypes.Structure):
79    _fields_ = (
80        ('cc', ctypes.c_uint),
81        ('update_flags', ctypes.c_bool),
82        ('writeback', ctypes.c_bool),
83        ('op_count', ctypes.c_uint8),
84        ('operands', Arm64Op * 8),
85    )
86
87def get_arch_info(a):
88    return (a.cc, a.update_flags, a.writeback, copy_ctypes_list(a.operands[:a.op_count]))
89
90