| // 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.Ppc_const.*; |
| |
| public class Ppc { |
| |
| public static class MemType extends Structure { |
| public int base; |
| public int disp; |
| |
| @Override |
| public List getFieldOrder() { |
| return Arrays.asList("base", "disp"); |
| } |
| } |
| |
| public static class CrxType extends Structure { |
| public int scale; |
| public int reg; |
| public int cond; |
| |
| @Override |
| public List getFieldOrder() { |
| return Arrays.asList("scale", "reg", "cond"); |
| } |
| } |
| |
| public static class OpValue extends Union { |
| public int reg; |
| public long imm; |
| public MemType mem; |
| public CrxType crx; |
| } |
| |
| public static class Operand extends Structure { |
| public int type; |
| public OpValue value; |
| |
| public void read() { |
| readField("type"); |
| if (type == PPC_OP_MEM) |
| value.setType(MemType.class); |
| if (type == PPC_OP_CRX) |
| value.setType(CrxType.class); |
| if (type == PPC_OP_IMM || type == PPC_OP_REG) |
| value.setType(Integer.TYPE); |
| if (type == PPC_OP_INVALID) |
| return; |
| readField("value"); |
| } |
| |
| @Override |
| public List getFieldOrder() { |
| return Arrays.asList("type", "value"); |
| } |
| } |
| |
| public static class UnionOpInfo extends Capstone.UnionOpInfo { |
| public int bc; |
| public int bh; |
| public byte update_cr0; |
| public byte op_count; |
| |
| public Operand [] op; |
| |
| public UnionOpInfo() { |
| op = new Operand[8]; |
| } |
| |
| public void read() { |
| readField("bc"); |
| readField("bh"); |
| readField("update_cr0"); |
| readField("op_count"); |
| op = new Operand[op_count]; |
| if (op_count != 0) |
| readField("op"); |
| } |
| |
| @Override |
| public List getFieldOrder() { |
| return Arrays.asList("bc", "bh", "update_cr0", "op_count", "op"); |
| } |
| } |
| |
| public static class OpInfo extends Capstone.OpInfo { |
| public int bc; |
| public int bh; |
| public boolean updateCr0; |
| |
| public Operand [] op; |
| |
| public OpInfo(UnionOpInfo op_info) { |
| bc = op_info.bc; |
| bh = op_info.bh; |
| updateCr0 = (op_info.update_cr0 > 0); |
| op = op_info.op; |
| } |
| } |
| } |