blob: fffbbe2c5d6c676882771fa069a55dae821742e0 [file] [log] [blame]
// Capstone Java binding
// By Nguyen Anh Quynh & Dang Hoang Vu, 2013
package capstone;
import com.sun.jna.Structure;
import com.sun.jna.Union;
import java.util.List;
import java.util.Arrays;
import static capstone.X86_const.*;
public class X86 {
public static class MemType extends Structure {
public int segment;
public int base;
public int index;
public int scale;
public long disp;
@Override
public List getFieldOrder() {
return Arrays.asList("segment", "base", "index", "scale", "disp");
}
}
public static class OpValue extends Union {
public int reg;
public long imm;
public MemType mem;
@Override
public List getFieldOrder() {
return Arrays.asList("reg", "imm", "mem");
}
}
public static class Operand extends Structure {
public int type;
public OpValue value;
public byte size;
public byte access;
public int avx_bcast;
public boolean avx_zero_opmask;
public void read() {
super.read();
if (type == X86_OP_MEM)
value.setType(MemType.class);
if (type == X86_OP_IMM)
value.setType(Long.TYPE);
if (type == X86_OP_REG)
value.setType(Integer.TYPE);
if (type == X86_OP_INVALID)
return;
readField("value");
}
@Override
public List getFieldOrder() {
return Arrays.asList("type", "value", "size", "access", "avx_bcast", "avx_zero_opmask");
}
}
public static class UnionOpInfo extends Capstone.UnionOpInfo {
public byte [] prefix;
public byte [] opcode;
public byte rex;
public byte addr_size;
public byte modrm;
public byte sib;
public int disp;
public int sib_index;
public byte sib_scale;
public int sib_base;
public int xop_cc;
public int sse_cc;
public int avx_cc;
public byte avx_sae;
public int avx_rm;
public int eflags;
public byte op_count;
public Operand [] op;
public UnionOpInfo() {
op = new Operand[8];
opcode = new byte[4];
prefix = new byte[4];
}
@Override
public List getFieldOrder() {
return Arrays.asList("prefix", "opcode", "rex", "addr_size",
"modrm", "sib", "disp", "sib_index", "sib_scale", "sib_base", "xop_cc", "sse_cc", "avx_cc", "avx_sae", "avx_rm", "eflags", "op_count", "op");
}
}
public static class OpInfo extends Capstone.OpInfo {
public byte [] prefix;
public byte [] opcode;
public byte opSize;
public byte rex;
public byte addrSize;
public byte dispSize;
public byte immSize;
public byte modrm;
public byte sib;
public int disp;
public int sibIndex;
public byte sibScale;
public int sibBase;
public int xopCC;
public int sseCC;
public int avxCC;
public boolean avxSae;
public int avxRm;
public int eflags;
public Operand[] op;
public OpInfo(UnionOpInfo e) {
prefix = e.prefix;
opcode = e.opcode;
rex = e.rex;
addrSize = e.addr_size;
modrm = e.modrm;
sib = e.sib;
disp = e.disp;
sibIndex = e.sib_index;
sibScale = e.sib_scale;
sibBase = e.sib_base;
xopCC = e.xop_cc;
sseCC = e.sse_cc;
avxCC = e.avx_cc;
avxSae = e.avx_sae > 0;
avxRm = e.avx_rm;
eflags = e.eflags;
op = new Operand[e.op_count];
for (int i=0; i<e.op_count; i++)
op[i] = e.op[i];
}
}
}