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