// 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.Arm_const.*; public class Arm { public static class MemType extends Structure { public int base; public int index; public int scale; public int disp; public int lshift; @Override public List getFieldOrder() { return Arrays.asList("base", "index", "scale", "disp", "lshift"); } } public static class OpValue extends Union { public int reg; public int imm; public double fp; public MemType mem; public int setend; @Override public List getFieldOrder() { return Arrays.asList("reg", "imm", "fp", "mem", "setend"); } } public static class OpShift extends Structure { public int type; public int value; @Override public List getFieldOrder() { return Arrays.asList("type","value"); } } public static class Operand extends Structure { public int vector_index; public OpShift shift; public int type; public OpValue value; public boolean subtracted; public byte access; public byte neon_lane; public void read() { readField("vector_index"); readField("type"); if (type == ARM_OP_MEM) value.setType(MemType.class); if (type == ARM_OP_FP) value.setType(Double.TYPE); if (type == ARM_OP_PIMM || type == ARM_OP_IMM || type == ARM_OP_CIMM) value.setType(Integer.TYPE); if (type == ARM_OP_REG) value.setType(Integer.TYPE); if (type == ARM_OP_INVALID) return; readField("value"); readField("shift"); readField("subtracted"); readField("access"); readField("neon_lane"); } @Override public List getFieldOrder() { return Arrays.asList("vector_index", "shift", "type", "value", "subtracted", "access", "neon_lane"); } } public static class UnionOpInfo extends Capstone.UnionOpInfo { public boolean usermode; public int vector_size; public int vector_data; public int cps_mode; public int cps_flag; public int cc; public byte update_flags; public byte writeback; public int mem_barrier; public byte op_count; public Operand [] op; public UnionOpInfo() { op = new Operand[36]; } public void read() { readField("usermode"); readField("vector_size"); readField("vector_data"); readField("cps_mode"); readField("cps_flag"); readField("cc"); readField("update_flags"); readField("writeback"); readField("mem_barrier"); readField("op_count"); op = new Operand[op_count]; if (op_count != 0) readField("op"); } @Override public List getFieldOrder() { return Arrays.asList("usermode", "vector_size", "vector_data", "cps_mode", "cps_flag", "cc", "update_flags", "writeback", "mem_barrier", "op_count", "op"); } } public static class OpInfo extends Capstone.OpInfo { public boolean usermode; public int vectorSize; public int vectorData; public int cpsMode; public int cpsFlag; public int cc; public boolean updateFlags; public boolean writeback; public int memBarrier; public Operand [] op = null; public OpInfo(UnionOpInfo op_info) { usermode = op_info.usermode; vectorSize = op_info.vector_size; vectorData = op_info.vector_data; cpsMode = op_info.cps_mode; cpsFlag = op_info.cps_flag; cc = op_info.cc; updateFlags = (op_info.update_flags > 0); writeback = (op_info.writeback > 0); memBarrier = op_info.mem_barrier; op = op_info.op; } } }