xref: /aosp_15_r20/external/capstone/cs_priv.h (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* By Nguyen Anh Quynh <[email protected]>, 2013-2015 */
3*9a0e4156SSadaf Ebrahimi 
4*9a0e4156SSadaf Ebrahimi #ifndef CS_PRIV_H
5*9a0e4156SSadaf Ebrahimi #define CS_PRIV_H
6*9a0e4156SSadaf Ebrahimi 
7*9a0e4156SSadaf Ebrahimi #include <capstone/capstone.h>
8*9a0e4156SSadaf Ebrahimi 
9*9a0e4156SSadaf Ebrahimi #include "MCInst.h"
10*9a0e4156SSadaf Ebrahimi #include "SStream.h"
11*9a0e4156SSadaf Ebrahimi 
12*9a0e4156SSadaf Ebrahimi typedef void (*Printer_t)(MCInst *MI, SStream *OS, void *info);
13*9a0e4156SSadaf Ebrahimi 
14*9a0e4156SSadaf Ebrahimi // function to be called after Printer_t
15*9a0e4156SSadaf Ebrahimi // this is the best time to gather insn's characteristics
16*9a0e4156SSadaf Ebrahimi typedef void (*PostPrinter_t)(csh handle, cs_insn *, char *mnem, MCInst *mci);
17*9a0e4156SSadaf Ebrahimi 
18*9a0e4156SSadaf Ebrahimi typedef bool (*Disasm_t)(csh handle, const uint8_t *code, size_t code_len, MCInst *instr, uint16_t *size, uint64_t address, void *info);
19*9a0e4156SSadaf Ebrahimi 
20*9a0e4156SSadaf Ebrahimi typedef const char *(*GetName_t)(csh handle, unsigned int id);
21*9a0e4156SSadaf Ebrahimi 
22*9a0e4156SSadaf Ebrahimi typedef void (*GetID_t)(cs_struct *h, cs_insn *insn, unsigned int id);
23*9a0e4156SSadaf Ebrahimi 
24*9a0e4156SSadaf Ebrahimi // return register name, given register ID
25*9a0e4156SSadaf Ebrahimi typedef const char *(*GetRegisterName_t)(unsigned RegNo);
26*9a0e4156SSadaf Ebrahimi 
27*9a0e4156SSadaf Ebrahimi // return registers accessed by instruction
28*9a0e4156SSadaf Ebrahimi typedef void (*GetRegisterAccess_t)(const cs_insn *insn,
29*9a0e4156SSadaf Ebrahimi 		cs_regs regs_read, uint8_t *regs_read_count,
30*9a0e4156SSadaf Ebrahimi 		cs_regs regs_write, uint8_t *regs_write_count);
31*9a0e4156SSadaf Ebrahimi 
32*9a0e4156SSadaf Ebrahimi // for ARM only
33*9a0e4156SSadaf Ebrahimi typedef struct ARM_ITStatus {
34*9a0e4156SSadaf Ebrahimi 	unsigned char ITStates[8];
35*9a0e4156SSadaf Ebrahimi 	unsigned int size;
36*9a0e4156SSadaf Ebrahimi } ARM_ITStatus;
37*9a0e4156SSadaf Ebrahimi 
38*9a0e4156SSadaf Ebrahimi // Customize mnemonic for instructions with alternative name.
39*9a0e4156SSadaf Ebrahimi struct customized_mnem {
40*9a0e4156SSadaf Ebrahimi 	// ID of instruction to be customized.
41*9a0e4156SSadaf Ebrahimi 	unsigned int id;
42*9a0e4156SSadaf Ebrahimi 	// Customized instruction mnemonic.
43*9a0e4156SSadaf Ebrahimi 	char mnemonic[CS_MNEMONIC_SIZE];
44*9a0e4156SSadaf Ebrahimi };
45*9a0e4156SSadaf Ebrahimi 
46*9a0e4156SSadaf Ebrahimi struct insn_mnem {
47*9a0e4156SSadaf Ebrahimi 	struct customized_mnem insn;
48*9a0e4156SSadaf Ebrahimi 	struct insn_mnem *next;	// linked list of customized mnemonics
49*9a0e4156SSadaf Ebrahimi };
50*9a0e4156SSadaf Ebrahimi 
51*9a0e4156SSadaf Ebrahimi struct cs_struct {
52*9a0e4156SSadaf Ebrahimi 	cs_arch arch;
53*9a0e4156SSadaf Ebrahimi 	cs_mode mode;
54*9a0e4156SSadaf Ebrahimi 	Printer_t printer;	// asm printer
55*9a0e4156SSadaf Ebrahimi 	void *printer_info; // aux info for printer
56*9a0e4156SSadaf Ebrahimi 	Disasm_t disasm;	// disassembler
57*9a0e4156SSadaf Ebrahimi 	void *getinsn_info; // auxiliary info for printer
58*9a0e4156SSadaf Ebrahimi 	GetName_t reg_name;
59*9a0e4156SSadaf Ebrahimi 	GetName_t insn_name;
60*9a0e4156SSadaf Ebrahimi 	GetName_t group_name;
61*9a0e4156SSadaf Ebrahimi 	GetID_t insn_id;
62*9a0e4156SSadaf Ebrahimi 	PostPrinter_t post_printer;
63*9a0e4156SSadaf Ebrahimi 	cs_err errnum;
64*9a0e4156SSadaf Ebrahimi 	ARM_ITStatus ITBlock;	// for Arm only
65*9a0e4156SSadaf Ebrahimi 	cs_opt_value detail, imm_unsigned;
66*9a0e4156SSadaf Ebrahimi 	int syntax;	// asm syntax for simple printer such as ARM, Mips & PPC
67*9a0e4156SSadaf Ebrahimi 	bool doing_mem;	// handling memory operand in InstPrinter code
68*9a0e4156SSadaf Ebrahimi 	unsigned short *insn_cache;	// index caching for mapping.c
69*9a0e4156SSadaf Ebrahimi 	GetRegisterName_t get_regname;
70*9a0e4156SSadaf Ebrahimi 	bool skipdata;	// set this to True if we skip data when disassembling
71*9a0e4156SSadaf Ebrahimi 	uint8_t skipdata_size;	// how many bytes to skip
72*9a0e4156SSadaf Ebrahimi 	cs_opt_skipdata skipdata_setup;	// user-defined skipdata setup
73*9a0e4156SSadaf Ebrahimi 	const uint8_t *regsize_map;	// map to register size (x86-only for now)
74*9a0e4156SSadaf Ebrahimi 	GetRegisterAccess_t reg_access;
75*9a0e4156SSadaf Ebrahimi 	struct insn_mnem *mnem_list;	// linked list of customized instruction mnemonic
76*9a0e4156SSadaf Ebrahimi };
77*9a0e4156SSadaf Ebrahimi 
78*9a0e4156SSadaf Ebrahimi #define MAX_ARCH CS_ARCH_MAX
79*9a0e4156SSadaf Ebrahimi 
80*9a0e4156SSadaf Ebrahimi // Returns a bool (0 or 1) whether big endian is enabled for a mode
81*9a0e4156SSadaf Ebrahimi #define MODE_IS_BIG_ENDIAN(mode) (((mode) & CS_MODE_BIG_ENDIAN) != 0)
82*9a0e4156SSadaf Ebrahimi 
83*9a0e4156SSadaf Ebrahimi extern cs_malloc_t cs_mem_malloc;
84*9a0e4156SSadaf Ebrahimi extern cs_calloc_t cs_mem_calloc;
85*9a0e4156SSadaf Ebrahimi extern cs_realloc_t cs_mem_realloc;
86*9a0e4156SSadaf Ebrahimi extern cs_free_t cs_mem_free;
87*9a0e4156SSadaf Ebrahimi extern cs_vsnprintf_t cs_vsnprintf;
88*9a0e4156SSadaf Ebrahimi 
89*9a0e4156SSadaf Ebrahimi #endif
90