xref: /aosp_15_r20/external/capstone/bindings/java/capstone/X86.java (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi // Capstone Java binding
2*9a0e4156SSadaf Ebrahimi // By Nguyen Anh Quynh & Dang Hoang Vu,  2013
3*9a0e4156SSadaf Ebrahimi 
4*9a0e4156SSadaf Ebrahimi package capstone;
5*9a0e4156SSadaf Ebrahimi 
6*9a0e4156SSadaf Ebrahimi import com.sun.jna.Structure;
7*9a0e4156SSadaf Ebrahimi import com.sun.jna.Union;
8*9a0e4156SSadaf Ebrahimi 
9*9a0e4156SSadaf Ebrahimi import java.util.List;
10*9a0e4156SSadaf Ebrahimi import java.util.Arrays;
11*9a0e4156SSadaf Ebrahimi 
12*9a0e4156SSadaf Ebrahimi import static capstone.X86_const.*;
13*9a0e4156SSadaf Ebrahimi 
14*9a0e4156SSadaf Ebrahimi public class X86 {
15*9a0e4156SSadaf Ebrahimi 
16*9a0e4156SSadaf Ebrahimi   public static class MemType extends Structure {
17*9a0e4156SSadaf Ebrahimi     public int segment;
18*9a0e4156SSadaf Ebrahimi     public int base;
19*9a0e4156SSadaf Ebrahimi     public int index;
20*9a0e4156SSadaf Ebrahimi     public int scale;
21*9a0e4156SSadaf Ebrahimi     public long disp;
22*9a0e4156SSadaf Ebrahimi 
23*9a0e4156SSadaf Ebrahimi     @Override
getFieldOrder()24*9a0e4156SSadaf Ebrahimi     public List getFieldOrder() {
25*9a0e4156SSadaf Ebrahimi       return Arrays.asList("segment", "base", "index", "scale", "disp");
26*9a0e4156SSadaf Ebrahimi     }
27*9a0e4156SSadaf Ebrahimi   }
28*9a0e4156SSadaf Ebrahimi 
29*9a0e4156SSadaf Ebrahimi   public static class Encoding extends Structure {
30*9a0e4156SSadaf Ebrahimi     public byte modrmOffset;
31*9a0e4156SSadaf Ebrahimi     public byte dispOffset;
32*9a0e4156SSadaf Ebrahimi     public byte dispSize;
33*9a0e4156SSadaf Ebrahimi     public byte immOffset;
34*9a0e4156SSadaf Ebrahimi     public byte immSize;
35*9a0e4156SSadaf Ebrahimi 
36*9a0e4156SSadaf Ebrahimi     @Override
getFieldOrder()37*9a0e4156SSadaf Ebrahimi     public List getFieldOrder() {
38*9a0e4156SSadaf Ebrahimi       return Arrays.asList("modrmOffset", "dispOffset", "dispSize", "immOffset", "immSize");
39*9a0e4156SSadaf Ebrahimi     }
40*9a0e4156SSadaf Ebrahimi   }
41*9a0e4156SSadaf Ebrahimi 
42*9a0e4156SSadaf Ebrahimi   public static class OpValue extends Union {
43*9a0e4156SSadaf Ebrahimi     public int reg;
44*9a0e4156SSadaf Ebrahimi     public long imm;
45*9a0e4156SSadaf Ebrahimi     public MemType mem;
46*9a0e4156SSadaf Ebrahimi 
47*9a0e4156SSadaf Ebrahimi     @Override
getFieldOrder()48*9a0e4156SSadaf Ebrahimi     public List getFieldOrder() {
49*9a0e4156SSadaf Ebrahimi       return Arrays.asList("reg", "imm", "mem");
50*9a0e4156SSadaf Ebrahimi     }
51*9a0e4156SSadaf Ebrahimi   }
52*9a0e4156SSadaf Ebrahimi 
53*9a0e4156SSadaf Ebrahimi   public static class Operand extends Structure {
54*9a0e4156SSadaf Ebrahimi     public int type;
55*9a0e4156SSadaf Ebrahimi     public OpValue value;
56*9a0e4156SSadaf Ebrahimi     public byte size;
57*9a0e4156SSadaf Ebrahimi     public byte access;
58*9a0e4156SSadaf Ebrahimi     public int avx_bcast;
59*9a0e4156SSadaf Ebrahimi     public boolean avx_zero_opmask;
60*9a0e4156SSadaf Ebrahimi 
read()61*9a0e4156SSadaf Ebrahimi     public void read() {
62*9a0e4156SSadaf Ebrahimi       super.read();
63*9a0e4156SSadaf Ebrahimi       if (type == X86_OP_MEM)
64*9a0e4156SSadaf Ebrahimi         value.setType(MemType.class);
65*9a0e4156SSadaf Ebrahimi       if (type == X86_OP_IMM)
66*9a0e4156SSadaf Ebrahimi         value.setType(Long.TYPE);
67*9a0e4156SSadaf Ebrahimi       if (type == X86_OP_REG)
68*9a0e4156SSadaf Ebrahimi         value.setType(Integer.TYPE);
69*9a0e4156SSadaf Ebrahimi       if (type == X86_OP_INVALID)
70*9a0e4156SSadaf Ebrahimi         return;
71*9a0e4156SSadaf Ebrahimi       readField("value");
72*9a0e4156SSadaf Ebrahimi     }
73*9a0e4156SSadaf Ebrahimi 
74*9a0e4156SSadaf Ebrahimi     @Override
getFieldOrder()75*9a0e4156SSadaf Ebrahimi     public List getFieldOrder() {
76*9a0e4156SSadaf Ebrahimi       return Arrays.asList("type", "value", "size", "access", "avx_bcast", "avx_zero_opmask");
77*9a0e4156SSadaf Ebrahimi     }
78*9a0e4156SSadaf Ebrahimi   }
79*9a0e4156SSadaf Ebrahimi 
80*9a0e4156SSadaf Ebrahimi   public static class UnionOpInfo extends Capstone.UnionOpInfo {
81*9a0e4156SSadaf Ebrahimi     public byte [] prefix;
82*9a0e4156SSadaf Ebrahimi     public byte [] opcode;
83*9a0e4156SSadaf Ebrahimi     public byte rex;
84*9a0e4156SSadaf Ebrahimi     public byte addr_size;
85*9a0e4156SSadaf Ebrahimi     public byte modrm;
86*9a0e4156SSadaf Ebrahimi     public byte sib;
87*9a0e4156SSadaf Ebrahimi     public long disp;
88*9a0e4156SSadaf Ebrahimi     public int sib_index;
89*9a0e4156SSadaf Ebrahimi     public byte sib_scale;
90*9a0e4156SSadaf Ebrahimi     public int sib_base;
91*9a0e4156SSadaf Ebrahimi     public int xop_cc;
92*9a0e4156SSadaf Ebrahimi     public int sse_cc;
93*9a0e4156SSadaf Ebrahimi     public int avx_cc;
94*9a0e4156SSadaf Ebrahimi     public byte avx_sae;
95*9a0e4156SSadaf Ebrahimi     public int avx_rm;
96*9a0e4156SSadaf Ebrahimi     public long eflags;
97*9a0e4156SSadaf Ebrahimi 
98*9a0e4156SSadaf Ebrahimi     public byte op_count;
99*9a0e4156SSadaf Ebrahimi 
100*9a0e4156SSadaf Ebrahimi     public Operand [] op;
101*9a0e4156SSadaf Ebrahimi 
102*9a0e4156SSadaf Ebrahimi     public Encoding encoding;
103*9a0e4156SSadaf Ebrahimi 
UnionOpInfo()104*9a0e4156SSadaf Ebrahimi     public UnionOpInfo() {
105*9a0e4156SSadaf Ebrahimi       op = new Operand[8];
106*9a0e4156SSadaf Ebrahimi       opcode = new byte[4];
107*9a0e4156SSadaf Ebrahimi       prefix = new byte[4];
108*9a0e4156SSadaf Ebrahimi     }
109*9a0e4156SSadaf Ebrahimi 
110*9a0e4156SSadaf Ebrahimi     @Override
getFieldOrder()111*9a0e4156SSadaf Ebrahimi     public List getFieldOrder() {
112*9a0e4156SSadaf Ebrahimi       return Arrays.asList("prefix", "opcode", "rex", "addr_size",
113*9a0e4156SSadaf Ebrahimi           "modrm", "sib", "disp", "sib_index", "sib_scale", "sib_base", "xop_cc", "sse_cc", "avx_cc", "avx_sae", "avx_rm", "eflags", "op_count", "op", "encoding");
114*9a0e4156SSadaf Ebrahimi     }
115*9a0e4156SSadaf Ebrahimi   }
116*9a0e4156SSadaf Ebrahimi 
117*9a0e4156SSadaf Ebrahimi   public static class OpInfo extends Capstone.OpInfo {
118*9a0e4156SSadaf Ebrahimi     public byte [] prefix;
119*9a0e4156SSadaf Ebrahimi     public byte [] opcode;
120*9a0e4156SSadaf Ebrahimi     public byte opSize;
121*9a0e4156SSadaf Ebrahimi     public byte rex;
122*9a0e4156SSadaf Ebrahimi     public byte addrSize;
123*9a0e4156SSadaf Ebrahimi     public byte dispSize;
124*9a0e4156SSadaf Ebrahimi     public byte immSize;
125*9a0e4156SSadaf Ebrahimi     public byte modrm;
126*9a0e4156SSadaf Ebrahimi     public byte sib;
127*9a0e4156SSadaf Ebrahimi     public long disp;
128*9a0e4156SSadaf Ebrahimi     public int sibIndex;
129*9a0e4156SSadaf Ebrahimi     public byte sibScale;
130*9a0e4156SSadaf Ebrahimi     public int sibBase;
131*9a0e4156SSadaf Ebrahimi     public int xopCC;
132*9a0e4156SSadaf Ebrahimi     public int sseCC;
133*9a0e4156SSadaf Ebrahimi     public int avxCC;
134*9a0e4156SSadaf Ebrahimi     public boolean avxSae;
135*9a0e4156SSadaf Ebrahimi     public int avxRm;
136*9a0e4156SSadaf Ebrahimi     public long eflags;
137*9a0e4156SSadaf Ebrahimi 
138*9a0e4156SSadaf Ebrahimi     public Operand[] op;
139*9a0e4156SSadaf Ebrahimi 
140*9a0e4156SSadaf Ebrahimi     public Encoding encoding;
141*9a0e4156SSadaf Ebrahimi 
OpInfo(UnionOpInfo e)142*9a0e4156SSadaf Ebrahimi     public OpInfo(UnionOpInfo e) {
143*9a0e4156SSadaf Ebrahimi       prefix = e.prefix;
144*9a0e4156SSadaf Ebrahimi       opcode = e.opcode;
145*9a0e4156SSadaf Ebrahimi       rex = e.rex;
146*9a0e4156SSadaf Ebrahimi       addrSize = e.addr_size;
147*9a0e4156SSadaf Ebrahimi       modrm = e.modrm;
148*9a0e4156SSadaf Ebrahimi       sib = e.sib;
149*9a0e4156SSadaf Ebrahimi       disp = e.disp;
150*9a0e4156SSadaf Ebrahimi       sibIndex = e.sib_index;
151*9a0e4156SSadaf Ebrahimi       sibScale = e.sib_scale;
152*9a0e4156SSadaf Ebrahimi       sibBase = e.sib_base;
153*9a0e4156SSadaf Ebrahimi       xopCC = e.xop_cc;
154*9a0e4156SSadaf Ebrahimi       sseCC = e.sse_cc;
155*9a0e4156SSadaf Ebrahimi       avxCC = e.avx_cc;
156*9a0e4156SSadaf Ebrahimi       avxSae = e.avx_sae > 0;
157*9a0e4156SSadaf Ebrahimi       avxRm = e.avx_rm;
158*9a0e4156SSadaf Ebrahimi       eflags = e.eflags;
159*9a0e4156SSadaf Ebrahimi       op = new Operand[e.op_count];
160*9a0e4156SSadaf Ebrahimi       for (int i=0; i<e.op_count; i++)
161*9a0e4156SSadaf Ebrahimi         op[i] = e.op[i];
162*9a0e4156SSadaf Ebrahimi       encoding = e.encoding;
163*9a0e4156SSadaf Ebrahimi     }
164*9a0e4156SSadaf Ebrahimi   }
165*9a0e4156SSadaf Ebrahimi }
166