1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #if defined(CAPSTONE_HAS_OSXKERNEL)
5*9a0e4156SSadaf Ebrahimi #include <Availability.h>
6*9a0e4156SSadaf Ebrahimi #include <libkern/libkern.h>
7*9a0e4156SSadaf Ebrahimi #else
8*9a0e4156SSadaf Ebrahimi #include <stdio.h>
9*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
10*9a0e4156SSadaf Ebrahimi #endif
11*9a0e4156SSadaf Ebrahimi #include <string.h>
12*9a0e4156SSadaf Ebrahimi
13*9a0e4156SSadaf Ebrahimi #include "MCInst.h"
14*9a0e4156SSadaf Ebrahimi #include "utils.h"
15*9a0e4156SSadaf Ebrahimi
16*9a0e4156SSadaf Ebrahimi #define MCINST_CACHE (ARR_SIZE(mcInst->Operands) - 1)
17*9a0e4156SSadaf Ebrahimi
MCInst_Init(MCInst * inst)18*9a0e4156SSadaf Ebrahimi void MCInst_Init(MCInst *inst)
19*9a0e4156SSadaf Ebrahimi {
20*9a0e4156SSadaf Ebrahimi unsigned int i;
21*9a0e4156SSadaf Ebrahimi
22*9a0e4156SSadaf Ebrahimi for (i = 0; i < 48; i++) {
23*9a0e4156SSadaf Ebrahimi inst->Operands[i].Kind = kInvalid;
24*9a0e4156SSadaf Ebrahimi inst->Operands[i].ImmVal = 0;
25*9a0e4156SSadaf Ebrahimi }
26*9a0e4156SSadaf Ebrahimi
27*9a0e4156SSadaf Ebrahimi inst->Opcode = 0;
28*9a0e4156SSadaf Ebrahimi inst->OpcodePub = 0;
29*9a0e4156SSadaf Ebrahimi inst->size = 0;
30*9a0e4156SSadaf Ebrahimi inst->has_imm = false;
31*9a0e4156SSadaf Ebrahimi inst->op1_size = 0;
32*9a0e4156SSadaf Ebrahimi inst->writeback = false;
33*9a0e4156SSadaf Ebrahimi inst->ac_idx = 0;
34*9a0e4156SSadaf Ebrahimi inst->popcode_adjust = 0;
35*9a0e4156SSadaf Ebrahimi inst->assembly[0] = '\0';
36*9a0e4156SSadaf Ebrahimi }
37*9a0e4156SSadaf Ebrahimi
MCInst_clear(MCInst * inst)38*9a0e4156SSadaf Ebrahimi void MCInst_clear(MCInst *inst)
39*9a0e4156SSadaf Ebrahimi {
40*9a0e4156SSadaf Ebrahimi inst->size = 0;
41*9a0e4156SSadaf Ebrahimi }
42*9a0e4156SSadaf Ebrahimi
43*9a0e4156SSadaf Ebrahimi // do not free @Op
MCInst_insert0(MCInst * inst,int index,MCOperand * Op)44*9a0e4156SSadaf Ebrahimi void MCInst_insert0(MCInst *inst, int index, MCOperand *Op)
45*9a0e4156SSadaf Ebrahimi {
46*9a0e4156SSadaf Ebrahimi int i;
47*9a0e4156SSadaf Ebrahimi
48*9a0e4156SSadaf Ebrahimi for(i = inst->size; i > index; i--)
49*9a0e4156SSadaf Ebrahimi //memcpy(&(inst->Operands[i]), &(inst->Operands[i-1]), sizeof(MCOperand));
50*9a0e4156SSadaf Ebrahimi inst->Operands[i] = inst->Operands[i-1];
51*9a0e4156SSadaf Ebrahimi
52*9a0e4156SSadaf Ebrahimi inst->Operands[index] = *Op;
53*9a0e4156SSadaf Ebrahimi inst->size++;
54*9a0e4156SSadaf Ebrahimi }
55*9a0e4156SSadaf Ebrahimi
MCInst_setOpcode(MCInst * inst,unsigned Op)56*9a0e4156SSadaf Ebrahimi void MCInst_setOpcode(MCInst *inst, unsigned Op)
57*9a0e4156SSadaf Ebrahimi {
58*9a0e4156SSadaf Ebrahimi inst->Opcode = Op;
59*9a0e4156SSadaf Ebrahimi }
60*9a0e4156SSadaf Ebrahimi
MCInst_setOpcodePub(MCInst * inst,unsigned Op)61*9a0e4156SSadaf Ebrahimi void MCInst_setOpcodePub(MCInst *inst, unsigned Op)
62*9a0e4156SSadaf Ebrahimi {
63*9a0e4156SSadaf Ebrahimi inst->OpcodePub = Op;
64*9a0e4156SSadaf Ebrahimi }
65*9a0e4156SSadaf Ebrahimi
MCInst_getOpcode(const MCInst * inst)66*9a0e4156SSadaf Ebrahimi unsigned MCInst_getOpcode(const MCInst *inst)
67*9a0e4156SSadaf Ebrahimi {
68*9a0e4156SSadaf Ebrahimi return inst->Opcode;
69*9a0e4156SSadaf Ebrahimi }
70*9a0e4156SSadaf Ebrahimi
MCInst_getOpcodePub(const MCInst * inst)71*9a0e4156SSadaf Ebrahimi unsigned MCInst_getOpcodePub(const MCInst *inst)
72*9a0e4156SSadaf Ebrahimi {
73*9a0e4156SSadaf Ebrahimi return inst->OpcodePub;
74*9a0e4156SSadaf Ebrahimi }
75*9a0e4156SSadaf Ebrahimi
MCInst_getOperand(MCInst * inst,unsigned i)76*9a0e4156SSadaf Ebrahimi MCOperand *MCInst_getOperand(MCInst *inst, unsigned i)
77*9a0e4156SSadaf Ebrahimi {
78*9a0e4156SSadaf Ebrahimi return &inst->Operands[i];
79*9a0e4156SSadaf Ebrahimi }
80*9a0e4156SSadaf Ebrahimi
MCInst_getNumOperands(const MCInst * inst)81*9a0e4156SSadaf Ebrahimi unsigned MCInst_getNumOperands(const MCInst *inst)
82*9a0e4156SSadaf Ebrahimi {
83*9a0e4156SSadaf Ebrahimi return inst->size;
84*9a0e4156SSadaf Ebrahimi }
85*9a0e4156SSadaf Ebrahimi
86*9a0e4156SSadaf Ebrahimi // This addOperand2 function doesnt free Op
MCInst_addOperand2(MCInst * inst,MCOperand * Op)87*9a0e4156SSadaf Ebrahimi void MCInst_addOperand2(MCInst *inst, MCOperand *Op)
88*9a0e4156SSadaf Ebrahimi {
89*9a0e4156SSadaf Ebrahimi inst->Operands[inst->size] = *Op;
90*9a0e4156SSadaf Ebrahimi
91*9a0e4156SSadaf Ebrahimi inst->size++;
92*9a0e4156SSadaf Ebrahimi }
93*9a0e4156SSadaf Ebrahimi
MCOperand_isValid(const MCOperand * op)94*9a0e4156SSadaf Ebrahimi bool MCOperand_isValid(const MCOperand *op)
95*9a0e4156SSadaf Ebrahimi {
96*9a0e4156SSadaf Ebrahimi return op->Kind != kInvalid;
97*9a0e4156SSadaf Ebrahimi }
98*9a0e4156SSadaf Ebrahimi
MCOperand_isReg(const MCOperand * op)99*9a0e4156SSadaf Ebrahimi bool MCOperand_isReg(const MCOperand *op)
100*9a0e4156SSadaf Ebrahimi {
101*9a0e4156SSadaf Ebrahimi return op->Kind == kRegister;
102*9a0e4156SSadaf Ebrahimi }
103*9a0e4156SSadaf Ebrahimi
MCOperand_isImm(const MCOperand * op)104*9a0e4156SSadaf Ebrahimi bool MCOperand_isImm(const MCOperand *op)
105*9a0e4156SSadaf Ebrahimi {
106*9a0e4156SSadaf Ebrahimi return op->Kind == kImmediate;
107*9a0e4156SSadaf Ebrahimi }
108*9a0e4156SSadaf Ebrahimi
MCOperand_isFPImm(const MCOperand * op)109*9a0e4156SSadaf Ebrahimi bool MCOperand_isFPImm(const MCOperand *op)
110*9a0e4156SSadaf Ebrahimi {
111*9a0e4156SSadaf Ebrahimi return op->Kind == kFPImmediate;
112*9a0e4156SSadaf Ebrahimi }
113*9a0e4156SSadaf Ebrahimi
114*9a0e4156SSadaf Ebrahimi /// getReg - Returns the register number.
MCOperand_getReg(const MCOperand * op)115*9a0e4156SSadaf Ebrahimi unsigned MCOperand_getReg(const MCOperand *op)
116*9a0e4156SSadaf Ebrahimi {
117*9a0e4156SSadaf Ebrahimi return op->RegVal;
118*9a0e4156SSadaf Ebrahimi }
119*9a0e4156SSadaf Ebrahimi
120*9a0e4156SSadaf Ebrahimi /// setReg - Set the register number.
MCOperand_setReg(MCOperand * op,unsigned Reg)121*9a0e4156SSadaf Ebrahimi void MCOperand_setReg(MCOperand *op, unsigned Reg)
122*9a0e4156SSadaf Ebrahimi {
123*9a0e4156SSadaf Ebrahimi op->RegVal = Reg;
124*9a0e4156SSadaf Ebrahimi }
125*9a0e4156SSadaf Ebrahimi
MCOperand_getImm(MCOperand * op)126*9a0e4156SSadaf Ebrahimi int64_t MCOperand_getImm(MCOperand *op)
127*9a0e4156SSadaf Ebrahimi {
128*9a0e4156SSadaf Ebrahimi return op->ImmVal;
129*9a0e4156SSadaf Ebrahimi }
130*9a0e4156SSadaf Ebrahimi
MCOperand_setImm(MCOperand * op,int64_t Val)131*9a0e4156SSadaf Ebrahimi void MCOperand_setImm(MCOperand *op, int64_t Val)
132*9a0e4156SSadaf Ebrahimi {
133*9a0e4156SSadaf Ebrahimi op->ImmVal = Val;
134*9a0e4156SSadaf Ebrahimi }
135*9a0e4156SSadaf Ebrahimi
MCOperand_getFPImm(const MCOperand * op)136*9a0e4156SSadaf Ebrahimi double MCOperand_getFPImm(const MCOperand *op)
137*9a0e4156SSadaf Ebrahimi {
138*9a0e4156SSadaf Ebrahimi return op->FPImmVal;
139*9a0e4156SSadaf Ebrahimi }
140*9a0e4156SSadaf Ebrahimi
MCOperand_setFPImm(MCOperand * op,double Val)141*9a0e4156SSadaf Ebrahimi void MCOperand_setFPImm(MCOperand *op, double Val)
142*9a0e4156SSadaf Ebrahimi {
143*9a0e4156SSadaf Ebrahimi op->FPImmVal = Val;
144*9a0e4156SSadaf Ebrahimi }
145*9a0e4156SSadaf Ebrahimi
MCOperand_CreateReg1(MCInst * mcInst,unsigned Reg)146*9a0e4156SSadaf Ebrahimi MCOperand *MCOperand_CreateReg1(MCInst *mcInst, unsigned Reg)
147*9a0e4156SSadaf Ebrahimi {
148*9a0e4156SSadaf Ebrahimi MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
149*9a0e4156SSadaf Ebrahimi
150*9a0e4156SSadaf Ebrahimi op->Kind = kRegister;
151*9a0e4156SSadaf Ebrahimi op->RegVal = Reg;
152*9a0e4156SSadaf Ebrahimi
153*9a0e4156SSadaf Ebrahimi return op;
154*9a0e4156SSadaf Ebrahimi }
155*9a0e4156SSadaf Ebrahimi
MCOperand_CreateReg0(MCInst * mcInst,unsigned Reg)156*9a0e4156SSadaf Ebrahimi void MCOperand_CreateReg0(MCInst *mcInst, unsigned Reg)
157*9a0e4156SSadaf Ebrahimi {
158*9a0e4156SSadaf Ebrahimi MCOperand *op = &(mcInst->Operands[mcInst->size]);
159*9a0e4156SSadaf Ebrahimi mcInst->size++;
160*9a0e4156SSadaf Ebrahimi
161*9a0e4156SSadaf Ebrahimi op->Kind = kRegister;
162*9a0e4156SSadaf Ebrahimi op->RegVal = Reg;
163*9a0e4156SSadaf Ebrahimi }
164*9a0e4156SSadaf Ebrahimi
MCOperand_CreateImm1(MCInst * mcInst,int64_t Val)165*9a0e4156SSadaf Ebrahimi MCOperand *MCOperand_CreateImm1(MCInst *mcInst, int64_t Val)
166*9a0e4156SSadaf Ebrahimi {
167*9a0e4156SSadaf Ebrahimi MCOperand *op = &(mcInst->Operands[MCINST_CACHE]);
168*9a0e4156SSadaf Ebrahimi
169*9a0e4156SSadaf Ebrahimi op->Kind = kImmediate;
170*9a0e4156SSadaf Ebrahimi op->ImmVal = Val;
171*9a0e4156SSadaf Ebrahimi
172*9a0e4156SSadaf Ebrahimi return op;
173*9a0e4156SSadaf Ebrahimi }
174*9a0e4156SSadaf Ebrahimi
MCOperand_CreateImm0(MCInst * mcInst,int64_t Val)175*9a0e4156SSadaf Ebrahimi void MCOperand_CreateImm0(MCInst *mcInst, int64_t Val)
176*9a0e4156SSadaf Ebrahimi {
177*9a0e4156SSadaf Ebrahimi MCOperand *op = &(mcInst->Operands[mcInst->size]);
178*9a0e4156SSadaf Ebrahimi mcInst->size++;
179*9a0e4156SSadaf Ebrahimi
180*9a0e4156SSadaf Ebrahimi op->Kind = kImmediate;
181*9a0e4156SSadaf Ebrahimi op->ImmVal = Val;
182*9a0e4156SSadaf Ebrahimi }
183