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