Nguyen Anh Quynh | 6023ef7 | 2014-04-29 11:21:04 +0800 | [diff] [blame] | 1 | /* Capstone Disassembly Engine */ |
Nguyen Anh Quynh | bfcaba5 | 2015-03-04 17:45:23 +0800 | [diff] [blame] | 2 | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */ |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 3 | |
Nguyen Anh Quynh | ae3649f | 2014-01-02 13:15:07 +0800 | [diff] [blame] | 4 | #ifndef CS_PRIV_H |
| 5 | #define CS_PRIV_H |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 6 | |
pancake | 9c10ace | 2015-02-24 04:55:55 +0100 | [diff] [blame] | 7 | #include <capstone/capstone.h> |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 8 | |
| 9 | #include "MCInst.h" |
| 10 | #include "SStream.h" |
| 11 | |
| 12 | typedef void (*Printer_t)(MCInst *MI, SStream *OS, void *info); |
| 13 | |
| 14 | // function to be called after Printer_t |
| 15 | // this is the best time to gather insn's characteristics |
Nguyen Anh Quynh | 6456481 | 2014-05-19 16:46:31 +0800 | [diff] [blame] | 16 | typedef void (*PostPrinter_t)(csh handle, cs_insn *, char *mnem, MCInst *mci); |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 17 | |
Nguyen Anh Quynh | a5ffdc3 | 2014-05-07 08:25:24 +0800 | [diff] [blame] | 18 | typedef bool (*Disasm_t)(csh handle, const uint8_t *code, size_t code_len, MCInst *instr, uint16_t *size, uint64_t address, void *info); |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 19 | |
Nguyen Anh Quynh | 650f96c | 2014-07-08 08:59:27 +0800 | [diff] [blame] | 20 | typedef const char *(*GetName_t)(csh handle, unsigned int id); |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 21 | |
Nguyen Anh Quynh | 1acfd0b | 2014-01-06 10:56:59 +0800 | [diff] [blame] | 22 | typedef void (*GetID_t)(cs_struct *h, cs_insn *insn, unsigned int id); |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 23 | |
Nguyen Anh Quynh | 2ff665a | 2014-03-11 00:18:50 +0800 | [diff] [blame] | 24 | // return register name, given register ID |
| 25 | typedef char *(*GetRegisterName_t)(unsigned RegNo); |
| 26 | |
Nguyen Anh Quynh | efffe78 | 2015-03-25 15:02:13 +0800 | [diff] [blame^] | 27 | // return registers accessed by instruction |
| 28 | typedef void (*GetRegisterAccess_t)(const cs_insn *insn, |
| 29 | cs_regs regs_read, uint8_t *regs_read_count, |
| 30 | cs_regs regs_write, uint8_t *regs_write_count); |
| 31 | |
Nguyen Anh Quynh | 7c7a8bc | 2013-12-02 13:16:44 +0800 | [diff] [blame] | 32 | // for ARM only |
| 33 | typedef struct ARM_ITStatus { |
| 34 | unsigned char ITStates[128]; // FIXME |
| 35 | unsigned int size; |
| 36 | } ARM_ITStatus; |
| 37 | |
Nguyen Anh Quynh | 42c6b1a | 2013-12-30 00:15:25 +0800 | [diff] [blame] | 38 | struct cs_struct { |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 39 | cs_arch arch; |
| 40 | cs_mode mode; |
| 41 | Printer_t printer; // asm printer |
| 42 | void *printer_info; // aux info for printer |
| 43 | Disasm_t disasm; // disassembler |
| 44 | void *getinsn_info; // auxiliary info for printer |
| 45 | bool big_endian; |
| 46 | GetName_t reg_name; |
| 47 | GetName_t insn_name; |
Nguyen Anh Quynh | 650f96c | 2014-07-08 08:59:27 +0800 | [diff] [blame] | 48 | GetName_t group_name; |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 49 | GetID_t insn_id; |
| 50 | PostPrinter_t post_printer; |
Nguyen Anh Quynh | 3eb9ac9 | 2013-11-27 15:24:47 +0800 | [diff] [blame] | 51 | cs_err errnum; |
Nguyen Anh Quynh | 7c7a8bc | 2013-12-02 13:16:44 +0800 | [diff] [blame] | 52 | ARM_ITStatus ITBlock; // for Arm only |
Nguyen Anh Quynh | a209e67 | 2013-12-14 00:23:41 +0800 | [diff] [blame] | 53 | cs_opt_value detail; |
Nguyen Anh Quynh | 2ff665a | 2014-03-11 00:18:50 +0800 | [diff] [blame] | 54 | int syntax; // asm syntax for simple printer such as ARM, Mips & PPC |
Nguyen Anh Quynh | 19b0de3 | 2013-12-31 22:40:04 +0800 | [diff] [blame] | 55 | bool doing_mem; // handling memory operand in InstPrinter code |
Nguyen Anh Quynh | 1acfd0b | 2014-01-06 10:56:59 +0800 | [diff] [blame] | 56 | unsigned short *insn_cache; // index caching for mapping.c |
Nguyen Anh Quynh | 2ff665a | 2014-03-11 00:18:50 +0800 | [diff] [blame] | 57 | GetRegisterName_t get_regname; |
Nguyen Anh Quynh | d3ffe37 | 2014-04-09 23:49:30 +0800 | [diff] [blame] | 58 | bool skipdata; // set this to True if we skip data when disassembling |
| 59 | uint8_t skipdata_size; // how many bytes to skip |
| 60 | cs_opt_skipdata skipdata_setup; // user-defined skipdata setup |
Nguyen Anh Quynh | 1085073 | 2014-06-18 12:16:24 +0800 | [diff] [blame] | 61 | uint8_t *regsize_map; // map to register size (x86-only for now) |
Nguyen Anh Quynh | efffe78 | 2015-03-25 15:02:13 +0800 | [diff] [blame^] | 62 | GetRegisterAccess_t reg_access; |
Nguyen Anh Quynh | 42c6b1a | 2013-12-30 00:15:25 +0800 | [diff] [blame] | 63 | }; |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 64 | |
Nguyen Anh Quynh | 0755282 | 2013-12-22 11:13:07 +0800 | [diff] [blame] | 65 | #define MAX_ARCH 8 |
Nguyen Anh Quynh | f185180 | 2013-12-21 12:16:47 +0800 | [diff] [blame] | 66 | |
Nguyen Anh Quynh | d345839 | 2013-12-22 11:10:56 +0800 | [diff] [blame] | 67 | // constructor initialization for all archs |
Nguyen Anh Quynh | 42c6b1a | 2013-12-30 00:15:25 +0800 | [diff] [blame] | 68 | extern cs_err (*arch_init[MAX_ARCH]) (cs_struct *); |
Nguyen Anh Quynh | d345839 | 2013-12-22 11:10:56 +0800 | [diff] [blame] | 69 | |
| 70 | // support cs_option() for all archs |
| 71 | extern cs_err (*arch_option[MAX_ARCH]) (cs_struct*, cs_opt_type, size_t value); |
Nguyen Anh Quynh | f185180 | 2013-12-21 12:16:47 +0800 | [diff] [blame] | 72 | |
Nguyen Anh Quynh | 39a42ed | 2013-12-22 10:40:58 +0800 | [diff] [blame] | 73 | extern unsigned int all_arch; |
Nguyen Anh Quynh | f185180 | 2013-12-21 12:16:47 +0800 | [diff] [blame] | 74 | |
Nguyen Anh Quynh | a8eb7a5 | 2014-01-11 12:55:31 +0800 | [diff] [blame] | 75 | extern cs_malloc_t cs_mem_malloc; |
| 76 | extern cs_calloc_t cs_mem_calloc; |
| 77 | extern cs_realloc_t cs_mem_realloc; |
| 78 | extern cs_free_t cs_mem_free; |
Nguyen Anh Quynh | edeeb04 | 2014-01-15 20:44:03 +0800 | [diff] [blame] | 79 | extern cs_vsnprintf_t cs_vsnprintf; |
Nguyen Anh Quynh | c740407 | 2014-01-05 11:35:47 +0800 | [diff] [blame] | 80 | |
Nguyen Anh Quynh | 26ee41a | 2013-11-27 12:11:31 +0800 | [diff] [blame] | 81 | #endif |