1*9a0e4156SSadaf Ebrahimi // Capstone Java binding 2*9a0e4156SSadaf Ebrahimi // By Nguyen Anh Quynh & Dang Hoang Vu, 2013 3*9a0e4156SSadaf Ebrahimi 4*9a0e4156SSadaf Ebrahimi package capstone; 5*9a0e4156SSadaf Ebrahimi 6*9a0e4156SSadaf Ebrahimi import com.sun.jna.Structure; 7*9a0e4156SSadaf Ebrahimi import com.sun.jna.Union; 8*9a0e4156SSadaf Ebrahimi 9*9a0e4156SSadaf Ebrahimi import java.util.List; 10*9a0e4156SSadaf Ebrahimi import java.util.Arrays; 11*9a0e4156SSadaf Ebrahimi 12*9a0e4156SSadaf Ebrahimi import static capstone.Ppc_const.*; 13*9a0e4156SSadaf Ebrahimi 14*9a0e4156SSadaf Ebrahimi public class Ppc { 15*9a0e4156SSadaf Ebrahimi 16*9a0e4156SSadaf Ebrahimi public static class MemType extends Structure { 17*9a0e4156SSadaf Ebrahimi public int base; 18*9a0e4156SSadaf Ebrahimi public int disp; 19*9a0e4156SSadaf Ebrahimi 20*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()21*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 22*9a0e4156SSadaf Ebrahimi return Arrays.asList("base", "disp"); 23*9a0e4156SSadaf Ebrahimi } 24*9a0e4156SSadaf Ebrahimi } 25*9a0e4156SSadaf Ebrahimi 26*9a0e4156SSadaf Ebrahimi public static class CrxType extends Structure { 27*9a0e4156SSadaf Ebrahimi public int scale; 28*9a0e4156SSadaf Ebrahimi public int reg; 29*9a0e4156SSadaf Ebrahimi public int cond; 30*9a0e4156SSadaf Ebrahimi 31*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()32*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 33*9a0e4156SSadaf Ebrahimi return Arrays.asList("scale", "reg", "cond"); 34*9a0e4156SSadaf Ebrahimi } 35*9a0e4156SSadaf Ebrahimi } 36*9a0e4156SSadaf Ebrahimi 37*9a0e4156SSadaf Ebrahimi public static class OpValue extends Union { 38*9a0e4156SSadaf Ebrahimi public int reg; 39*9a0e4156SSadaf Ebrahimi public long imm; 40*9a0e4156SSadaf Ebrahimi public MemType mem; 41*9a0e4156SSadaf Ebrahimi public CrxType crx; 42*9a0e4156SSadaf Ebrahimi } 43*9a0e4156SSadaf Ebrahimi 44*9a0e4156SSadaf Ebrahimi public static class Operand extends Structure { 45*9a0e4156SSadaf Ebrahimi public int type; 46*9a0e4156SSadaf Ebrahimi public OpValue value; 47*9a0e4156SSadaf Ebrahimi read()48*9a0e4156SSadaf Ebrahimi public void read() { 49*9a0e4156SSadaf Ebrahimi readField("type"); 50*9a0e4156SSadaf Ebrahimi if (type == PPC_OP_MEM) 51*9a0e4156SSadaf Ebrahimi value.setType(MemType.class); 52*9a0e4156SSadaf Ebrahimi if (type == PPC_OP_CRX) 53*9a0e4156SSadaf Ebrahimi value.setType(CrxType.class); 54*9a0e4156SSadaf Ebrahimi if (type == PPC_OP_IMM || type == PPC_OP_REG) 55*9a0e4156SSadaf Ebrahimi value.setType(Integer.TYPE); 56*9a0e4156SSadaf Ebrahimi if (type == PPC_OP_INVALID) 57*9a0e4156SSadaf Ebrahimi return; 58*9a0e4156SSadaf Ebrahimi readField("value"); 59*9a0e4156SSadaf Ebrahimi } 60*9a0e4156SSadaf Ebrahimi 61*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()62*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 63*9a0e4156SSadaf Ebrahimi return Arrays.asList("type", "value"); 64*9a0e4156SSadaf Ebrahimi } 65*9a0e4156SSadaf Ebrahimi } 66*9a0e4156SSadaf Ebrahimi 67*9a0e4156SSadaf Ebrahimi public static class UnionOpInfo extends Capstone.UnionOpInfo { 68*9a0e4156SSadaf Ebrahimi public int bc; 69*9a0e4156SSadaf Ebrahimi public int bh; 70*9a0e4156SSadaf Ebrahimi public byte update_cr0; 71*9a0e4156SSadaf Ebrahimi public byte op_count; 72*9a0e4156SSadaf Ebrahimi 73*9a0e4156SSadaf Ebrahimi public Operand [] op; 74*9a0e4156SSadaf Ebrahimi UnionOpInfo()75*9a0e4156SSadaf Ebrahimi public UnionOpInfo() { 76*9a0e4156SSadaf Ebrahimi op = new Operand[8]; 77*9a0e4156SSadaf Ebrahimi } 78*9a0e4156SSadaf Ebrahimi read()79*9a0e4156SSadaf Ebrahimi public void read() { 80*9a0e4156SSadaf Ebrahimi readField("bc"); 81*9a0e4156SSadaf Ebrahimi readField("bh"); 82*9a0e4156SSadaf Ebrahimi readField("update_cr0"); 83*9a0e4156SSadaf Ebrahimi readField("op_count"); 84*9a0e4156SSadaf Ebrahimi op = new Operand[op_count]; 85*9a0e4156SSadaf Ebrahimi if (op_count != 0) 86*9a0e4156SSadaf Ebrahimi readField("op"); 87*9a0e4156SSadaf Ebrahimi } 88*9a0e4156SSadaf Ebrahimi 89*9a0e4156SSadaf Ebrahimi @Override getFieldOrder()90*9a0e4156SSadaf Ebrahimi public List getFieldOrder() { 91*9a0e4156SSadaf Ebrahimi return Arrays.asList("bc", "bh", "update_cr0", "op_count", "op"); 92*9a0e4156SSadaf Ebrahimi } 93*9a0e4156SSadaf Ebrahimi } 94*9a0e4156SSadaf Ebrahimi 95*9a0e4156SSadaf Ebrahimi public static class OpInfo extends Capstone.OpInfo { 96*9a0e4156SSadaf Ebrahimi public int bc; 97*9a0e4156SSadaf Ebrahimi public int bh; 98*9a0e4156SSadaf Ebrahimi public boolean updateCr0; 99*9a0e4156SSadaf Ebrahimi 100*9a0e4156SSadaf Ebrahimi public Operand [] op; 101*9a0e4156SSadaf Ebrahimi OpInfo(UnionOpInfo op_info)102*9a0e4156SSadaf Ebrahimi public OpInfo(UnionOpInfo op_info) { 103*9a0e4156SSadaf Ebrahimi bc = op_info.bc; 104*9a0e4156SSadaf Ebrahimi bh = op_info.bh; 105*9a0e4156SSadaf Ebrahimi updateCr0 = (op_info.update_cr0 > 0); 106*9a0e4156SSadaf Ebrahimi op = op_info.op; 107*9a0e4156SSadaf Ebrahimi } 108*9a0e4156SSadaf Ebrahimi } 109*9a0e4156SSadaf Ebrahimi } 110