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.Arm_const.*; 13 14 public class Arm { 15 16 public static class MemType extends Structure { 17 public int base; 18 public int index; 19 public int scale; 20 public int disp; 21 public int lshift; 22 23 @Override getFieldOrder()24 public List getFieldOrder() { 25 return Arrays.asList("base", "index", "scale", "disp", "lshift"); 26 } 27 } 28 29 public static class OpValue extends Union { 30 public int reg; 31 public int imm; 32 public double fp; 33 public MemType mem; 34 public int setend; 35 36 @Override getFieldOrder()37 public List getFieldOrder() { 38 return Arrays.asList("reg", "imm", "fp", "mem", "setend"); 39 } 40 } 41 42 public static class OpShift extends Structure { 43 public int type; 44 public int value; 45 46 @Override getFieldOrder()47 public List getFieldOrder() { 48 return Arrays.asList("type","value"); 49 } 50 } 51 52 public static class Operand extends Structure { 53 public int vector_index; 54 public OpShift shift; 55 public int type; 56 public OpValue value; 57 public boolean subtracted; 58 public byte access; 59 public byte neon_lane; 60 read()61 public void read() { 62 readField("vector_index"); 63 readField("type"); 64 if (type == ARM_OP_MEM) 65 value.setType(MemType.class); 66 if (type == ARM_OP_FP) 67 value.setType(Double.TYPE); 68 if (type == ARM_OP_PIMM || type == ARM_OP_IMM || type == ARM_OP_CIMM) 69 value.setType(Integer.TYPE); 70 if (type == ARM_OP_REG) 71 value.setType(Integer.TYPE); 72 if (type == ARM_OP_INVALID) 73 return; 74 readField("value"); 75 readField("shift"); 76 readField("subtracted"); 77 readField("access"); 78 readField("neon_lane"); 79 } 80 81 @Override getFieldOrder()82 public List getFieldOrder() { 83 return Arrays.asList("vector_index", "shift", "type", "value", "subtracted", "access", "neon_lane"); 84 } 85 } 86 87 public static class UnionOpInfo extends Capstone.UnionOpInfo { 88 public boolean usermode; 89 public int vector_size; 90 public int vector_data; 91 public int cps_mode; 92 public int cps_flag; 93 public int cc; 94 public byte update_flags; 95 public byte writeback; 96 public int mem_barrier; 97 public byte op_count; 98 99 public Operand [] op; 100 UnionOpInfo()101 public UnionOpInfo() { 102 op = new Operand[36]; 103 } 104 read()105 public void read() { 106 readField("usermode"); 107 readField("vector_size"); 108 readField("vector_data"); 109 readField("cps_mode"); 110 readField("cps_flag"); 111 readField("cc"); 112 readField("update_flags"); 113 readField("writeback"); 114 readField("mem_barrier"); 115 readField("op_count"); 116 op = new Operand[op_count]; 117 if (op_count != 0) 118 readField("op"); 119 } 120 121 @Override getFieldOrder()122 public List getFieldOrder() { 123 return Arrays.asList("usermode", "vector_size", "vector_data", 124 "cps_mode", "cps_flag", "cc", "update_flags", "writeback", "mem_barrier", "op_count", "op"); 125 } 126 } 127 128 public static class OpInfo extends Capstone.OpInfo { 129 public boolean usermode; 130 public int vectorSize; 131 public int vectorData; 132 public int cpsMode; 133 public int cpsFlag; 134 public int cc; 135 public boolean updateFlags; 136 public boolean writeback; 137 public int memBarrier; 138 public Operand [] op = null; 139 OpInfo(UnionOpInfo op_info)140 public OpInfo(UnionOpInfo op_info) { 141 usermode = op_info.usermode; 142 vectorSize = op_info.vector_size; 143 vectorData = op_info.vector_data; 144 cpsMode = op_info.cps_mode; 145 cpsFlag = op_info.cps_flag; 146 cc = op_info.cc; 147 updateFlags = (op_info.update_flags > 0); 148 writeback = (op_info.writeback > 0); 149 memBarrier = op_info.mem_barrier; 150 op = op_info.op; 151 } 152 } 153 } 154