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