blob: 8aa40029b6df432800b258dff8029c5fb51445f8 [file] [log] [blame]
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +08001/* Capstone Disassembler Engine */
2/* By Dang Hoang Vu <danghvu@gmail.com> 2013 */
3
Nguyen Anh Quynh24bf0d92014-01-05 11:19:04 +08004#include "../../utils.h"
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +08005#include "../../MCRegisterInfo.h"
6#include "MipsDisassembler.h"
7#include "MipsInstPrinter.h"
Nguyen Anh Quynh37327252014-01-20 09:47:21 +08008#include "MipsMapping.h"
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +08009
danghvu701b8502014-01-09 11:06:44 +070010void enable_mips() {};
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080011
Nguyen Anh Quynhec4ead22013-12-28 14:34:21 +080012static cs_err init(cs_struct *ud)
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080013{
Nguyen Anh Quynha8eb7a52014-01-11 12:55:31 +080014 MCRegisterInfo *mri = cs_mem_malloc(sizeof(*mri));
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080015
16 Mips_init(mri);
17 ud->printer = Mips_printInst;
18 ud->printer_info = mri;
19 ud->getinsn_info = mri;
20 ud->reg_name = Mips_reg_name;
21 ud->insn_id = Mips_get_insn_id;
22 ud->insn_name = Mips_insn_name;
23
24 if (ud->mode & CS_MODE_32)
25 ud->disasm = Mips_getInstruction;
26 else
27 ud->disasm = Mips64_getInstruction;
Nguyen Anh Quynhec4ead22013-12-28 14:34:21 +080028
29 return CS_ERR_OK;
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080030}
31
Nguyen Anh Quynhd3458392013-12-22 11:10:56 +080032static cs_err option(cs_struct *handle, cs_opt_type type, size_t value)
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080033{
34 if (type == CS_OPT_MODE) {
35 if (value & CS_MODE_32)
36 handle->disasm = Mips_getInstruction;
37 else
38 handle->disasm = Mips64_getInstruction;
39
40 handle->mode = value;
41 }
42 return CS_ERR_OK;
43}
44
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080045static void destroy(cs_struct *handle)
46{
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080047}
48
Nguyen Anh Quynhc272e9d2014-01-19 12:03:22 +080049void Mips_enable(void)
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080050{
Nguyen Anh Quynhd3458392013-12-22 11:10:56 +080051 arch_init[CS_ARCH_MIPS] = init;
52 arch_option[CS_ARCH_MIPS] = option;
Nguyen Anh Quynhb2654062014-01-03 17:08:58 +080053 arch_destroy[CS_ARCH_MIPS] = destroy;
Nguyen Anh Quynhf954f872013-12-22 18:49:22 +080054
55 // support this arch
56 all_arch |= (1 << CS_ARCH_MIPS);
Nguyen Anh Quynh13a7d952013-12-21 12:19:44 +080057}