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