Index: src/third_party/libdisasm/swig/libdisasm_oop.i |
diff --git a/src/third_party/libdisasm/swig/libdisasm_oop.i b/src/third_party/libdisasm/swig/libdisasm_oop.i |
deleted file mode 100644 |
index 973a47e27b1f8ae462597b52fc6515a7695bb8fa..0000000000000000000000000000000000000000 |
--- a/src/third_party/libdisasm/swig/libdisasm_oop.i |
+++ /dev/null |
@@ -1,1114 +0,0 @@ |
-%module x86disasm |
-%{ |
-#ifdef _MSC_VER |
- typedef __int64 qword; |
-#else |
- typedef long long qword; |
-#endif |
- |
-#include <sys/types.h> |
- |
-#define MAX_REGNAME 8 |
-#define MAX_PREFIX_STR 32 |
-#define MAX_MNEM_STR 16 |
-#define MAX_INSN_SIZE 20 |
-#define MAX_OP_STRING 32 |
-#define MAX_OP_RAW_STRING 64 |
-#define MAX_OP_XML_STRING 256 |
-#define MAX_NUM_OPERANDS 8 |
-#define MAX_INSN_STRING 512 |
-#define MAX_INSN_RAW_STRING 1024 |
-#define MAX_INSN_XML_STRING 4096 |
- |
-#include "../../../config.h" |
- |
- |
-const char * version_string( void ) { |
- return PACKAGE_VERSION; |
-} |
- |
-%} |
- |
-const char * version_string( void ); |
- |
-%rename(X86_Register) x86_reg_t; |
-%rename(X86_EAddr) x86_ea_t; |
-%rename(X86_Operand) x86_op_t; |
-//%rename(X86_OpList) x86_oplist_t; |
-%rename(X86_Insn) x86_insn_t; |
-%rename(X86_InvOperand) x86_invariant_op_t; |
-%rename(X86_Invariant) x86_invariant_t; |
- |
-%include "carrays.i" |
- |
-%array_class( unsigned char, byteArray ); |
- |
- |
-%apply (unsigned char *STRING, int LENGTH) { |
- (unsigned char *buf, size_t buf_len) |
-}; |
- |
- |
-%inline %{ |
- |
- |
-enum x86_asm_format { |
- unknown_syntax = 0, /* never use! */ |
- native_syntax, /* header: 35 bytes */ |
- intel_syntax, /* header: 23 bytes */ |
- att_syntax, /* header: 23 bytes */ |
- xml_syntax, /* header: 679 bytes */ |
- raw_syntax /* header: 172 bytes */ |
-}; |
-%} |
- |
-/* ================================================================== */ |
-/* operand class */ |
-%inline %{ |
- enum x86_reg_type { |
- reg_gen = 0x00001, reg_in = 0x00002, |
- reg_out = 0x00004, reg_local = 0x00008, |
- reg_fpu = 0x00010, reg_seg = 0x00020, |
- reg_simd = 0x00040, reg_sys = 0x00080, |
- reg_sp = 0x00100, reg_fp = 0x00200, |
- reg_pc = 0x00400, reg_retaddr = 0x00800, |
- reg_cond = 0x01000, reg_zero = 0x02000, |
- reg_ret = 0x04000, reg_src = 0x10000, |
- reg_dest = 0x20000, reg_count = 0x40000 |
- }; |
- |
- typedef struct { |
- char name[MAX_REGNAME]; |
- enum x86_reg_type type; |
- unsigned int size; |
- unsigned int id; |
- unsigned int alias; |
- unsigned int shift; |
- } x86_reg_t; |
- |
- void x86_reg_from_id( unsigned int id, x86_reg_t * reg ); |
- |
- typedef struct { |
- unsigned int scale; |
- x86_reg_t index, base; |
- long disp; |
- char disp_sign; |
- char disp_size; |
- } x86_ea_t; |
- |
- enum x86_op_type { |
- op_unused = 0, |
- op_register = 1, |
- op_immediate = 2, |
- op_relative_near = 3, |
- op_relative_far = 4, |
- op_absolute = 5, |
- op_expression = 6, |
- op_offset = 7, |
- op_unknown |
- }; |
- |
- enum x86_op_datatype { |
- op_byte = 1, op_word = 2, |
- op_dword = 3, op_qword = 4, |
- op_dqword = 5, op_sreal = 6, |
- op_dreal = 7, op_extreal = 8, |
- op_bcd = 9, op_ssimd = 10, |
- op_dsimd = 11, op_sssimd = 12, |
- op_sdsimd = 13, op_descr32 = 14, |
- op_descr16 = 15, op_pdescr32 = 16, |
- op_pdescr16 = 17, op_fpuenv = 18, |
- op_fpregset = 19, |
- }; |
- |
- enum x86_op_access { |
- op_read = 1, |
- op_write = 2, |
- op_execute = 4 |
- }; |
- |
- enum x86_op_flags { |
- op_signed = 1, op_string = 2, |
- op_constant = 4, op_pointer = 8, |
- op_sysref = 0x010, op_implied = 0x020, |
- op_hardcode = 0x40, op_es_seg = 0x100, |
- op_cs_seg = 0x200, op_ss_seg = 0x300, |
- op_ds_seg = 0x400, op_fs_seg = 0x500, |
- op_gs_seg = 0x600 |
- }; |
- |
- typedef struct { |
- enum x86_op_type type; |
- enum x86_op_datatype datatype; |
- enum x86_op_access access; |
- enum x86_op_flags flags; |
- union { |
- char sbyte; |
- short sword; |
- long sdword; |
- qword sqword; |
- unsigned char byte; |
- unsigned short word; |
- unsigned long dword; |
- qword qword; |
- float sreal; |
- double dreal; |
- unsigned char extreal[10]; |
- unsigned char bcd[10]; |
- qword dqword[2]; |
- unsigned char simd[16]; |
- unsigned char fpuenv[28]; |
- void * address; |
- unsigned long offset; |
- x86_reg_t reg; |
- char relative_near; |
- long relative_far; |
- x86_ea_t expression; |
- } data; |
- void * insn; |
- } x86_op_t; |
- |
- unsigned int x86_operand_size( x86_op_t *op ); |
- |
- int x86_format_operand(x86_op_t *op, char *buf, int len, |
- enum x86_asm_format format); |
-%} |
- |
-%extend x86_reg_t{ |
- x86_reg_t * aliased_reg( ) { |
- x86_reg_t * reg = (x86_reg_t * ) |
- calloc( sizeof(x86_reg_t), 1 ); |
- x86_reg_from_id( self->id, reg ); |
- return reg; |
- } |
-} |
- |
-%extend x86_op_t{ |
- size_t size() { |
- return x86_operand_size( self ); |
- } |
- char * format( enum x86_asm_format format ) { |
- char *buf, *str; |
- size_t len; |
- |
- switch ( format ) { |
- case xml_syntax: |
- len = MAX_OP_XML_STRING; |
- break; |
- case raw_syntax: |
- len = MAX_OP_RAW_STRING; |
- break; |
- case native_syntax: |
- case intel_syntax: |
- case att_syntax: |
- case unknown_syntax: |
- default: |
- len = MAX_OP_STRING; |
- break; |
- } |
- |
- buf = (char * ) calloc( len + 1, 1 ); |
- x86_format_operand( self, buf, len, format ); |
- |
- /* drop buffer down to a reasonable size */ |
- str = strdup( buf ); |
- free(buf); |
- return str; |
- } |
- |
- int is_address( ) { |
- if ( self->type == op_absolute || |
- self->type == op_offset ) { |
- return 1; |
- } |
- |
- return 0; |
- } |
- |
- int is_relative( ) { |
- if ( self->type == op_relative_near || |
- self->type == op_relative_far ) { |
- return 1; |
- } |
- |
- return 0; |
- } |
- |
- %newobject copy; |
- x86_op_t * copy() { |
- x86_op_t *op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); |
- |
- if ( op ) { |
- memcpy( op, self, sizeof(x86_op_t) ); |
- } |
- |
- return op; |
- } |
-} |
- |
-/* ================================================================== */ |
-/* operand list class */ |
-%inline %{ |
- typedef struct X86_OpListNode { |
- x86_op_t *op; |
- struct X86_OpListNode *next, *prev; |
- } X86_OpListNode; |
- |
- typedef struct X86_OpList { |
- size_t count; |
- X86_OpListNode *head, *tail, *curr; |
- } X86_OpList; |
-%} |
- |
-%extend X86_OpList { |
- X86_OpList () { |
- X86_OpList *list = (X86_OpList *) |
- calloc( sizeof(X86_OpList), 1 ); |
- list->count = 0; |
- return list; |
- } |
- |
- ~X86_OpList() { |
- X86_OpListNode *node, *next; |
- |
- node = self->head; |
- while ( node ) { |
- next = node->next; |
- /* free( node->insn ); */ |
- free( node ); |
- node = next; |
- } |
- |
- free( self ); |
- } |
- |
- X86_OpListNode * first() { |
- self->curr = self->head; |
- return self->head; |
- } |
- |
- X86_OpListNode * last() { |
- self->curr = self->tail; |
- return self->tail; |
- } |
- |
- X86_OpListNode * next() { |
- if (! self->curr ) { |
- self->curr = self->head; |
- return self->head; |
- } |
- |
- self->curr = self->curr->next; |
- return self->curr; |
- } |
- |
- X86_OpListNode * prev() { |
- if (! self->curr ) { |
- self->curr = self->tail; |
- return self->tail; |
- } |
- |
- self->curr = self->curr->prev; |
- return self->curr; |
- } |
- |
- %newobject append; |
- void append( x86_op_t *op ) { |
- X86_OpListNode *node = (X86_OpListNode *) |
- calloc( sizeof(X86_OpListNode) , 1 ); |
- if (! node ) { |
- return; |
- } |
- |
- self->count++; |
- if ( ! self->tail ) { |
- self->head = self->tail = node; |
- } else { |
- self->tail->next = node; |
- node->prev = self->tail; |
- self->tail = node; |
- } |
- |
- node->op = x86_op_t_copy( op ); |
- } |
-} |
- |
-%inline %{ |
- typedef struct x86_operand_list { |
- x86_op_t op; |
- struct x86_operand_list *next; |
- } x86_oplist_t; |
-%} |
- |
-%extend x86_oplist_t { |
- %newobject x86_oplist_node_copy; |
-} |
- |
-/* ================================================================== */ |
-/* instruction class */ |
-%inline %{ |
- x86_oplist_t * x86_oplist_node_copy( x86_oplist_t * list ) { |
- x86_oplist_t *ptr; |
- ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); |
- if ( ptr ) { |
- memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); |
- } |
- |
- return ptr; |
- } |
- |
- enum x86_insn_group { |
- insn_none = 0, insn_controlflow = 1, |
- insn_arithmetic = 2, insn_logic = 3, |
- insn_stack = 4, insn_comparison = 5, |
- insn_move = 6, insn_string = 7, |
- insn_bit_manip = 8, insn_flag_manip = 9, |
- insn_fpu = 10, insn_interrupt = 13, |
- insn_system = 14, insn_other = 15 |
- }; |
- |
- enum x86_insn_type { |
- insn_invalid = 0, insn_jmp = 0x1001, |
- insn_jcc = 0x1002, insn_call = 0x1003, |
- insn_callcc = 0x1004, insn_return = 0x1005, |
- insn_add = 0x2001, insn_sub = 0x2002, |
- insn_mul = 0x2003, insn_div = 0x2004, |
- insn_inc = 0x2005, insn_dec = 0x2006, |
- insn_shl = 0x2007, insn_shr = 0x2008, |
- insn_rol = 0x2009, insn_ror = 0x200A, |
- insn_and = 0x3001, insn_or = 0x3002, |
- insn_xor = 0x3003, insn_not = 0x3004, |
- insn_neg = 0x3005, insn_push = 0x4001, |
- insn_pop = 0x4002, insn_pushregs = 0x4003, |
- insn_popregs = 0x4004, insn_pushflags = 0x4005, |
- insn_popflags = 0x4006, insn_enter = 0x4007, |
- insn_leave = 0x4008, insn_test = 0x5001, |
- insn_cmp = 0x5002, insn_mov = 0x6001, |
- insn_movcc = 0x6002, insn_xchg = 0x6003, |
- insn_xchgcc = 0x6004, insn_strcmp = 0x7001, |
- insn_strload = 0x7002, insn_strmov = 0x7003, |
- insn_strstore = 0x7004, insn_translate = 0x7005, |
- insn_bittest = 0x8001, insn_bitset = 0x8002, |
- insn_bitclear = 0x8003, insn_clear_carry = 0x9001, |
- insn_clear_zero = 0x9002, insn_clear_oflow = 0x9003, |
- insn_clear_dir = 0x9004, insn_clear_sign = 0x9005, |
- insn_clear_parity = 0x9006, insn_set_carry = 0x9007, |
- insn_set_zero = 0x9008, insn_set_oflow = 0x9009, |
- insn_set_dir = 0x900A, insn_set_sign = 0x900B, |
- insn_set_parity = 0x900C, insn_tog_carry = 0x9010, |
- insn_tog_zero = 0x9020, insn_tog_oflow = 0x9030, |
- insn_tog_dir = 0x9040, insn_tog_sign = 0x9050, |
- insn_tog_parity = 0x9060, insn_fmov = 0xA001, |
- insn_fmovcc = 0xA002, insn_fneg = 0xA003, |
- insn_fabs = 0xA004, insn_fadd = 0xA005, |
- insn_fsub = 0xA006, insn_fmul = 0xA007, |
- insn_fdiv = 0xA008, insn_fsqrt = 0xA009, |
- insn_fcmp = 0xA00A, insn_fcos = 0xA00C, |
- insn_fldpi = 0xA00D, insn_fldz = 0xA00E, |
- insn_ftan = 0xA00F, insn_fsine = 0xA010, |
- insn_fsys = 0xA020, insn_int = 0xD001, |
- insn_intcc = 0xD002, insn_iret = 0xD003, |
- insn_bound = 0xD004, insn_debug = 0xD005, |
- insn_trace = 0xD006, insn_invalid_op = 0xD007, |
- insn_oflow = 0xD008, insn_halt = 0xE001, |
- insn_in = 0xE002, insn_out = 0xE003, |
- insn_cpuid = 0xE004, insn_nop = 0xF001, |
- insn_bcdconv = 0xF002, insn_szconv = 0xF003 |
- }; |
- |
- enum x86_insn_note { |
- insn_note_ring0 = 1, |
- insn_note_smm = 2, |
- insn_note_serial = 4 |
- }; |
- |
- enum x86_flag_status { |
- insn_carry_set = 0x1, |
- insn_zero_set = 0x2, |
- insn_oflow_set = 0x4, |
- insn_dir_set = 0x8, |
- insn_sign_set = 0x10, |
- insn_parity_set = 0x20, |
- insn_carry_or_zero_set = 0x40, |
- insn_zero_set_or_sign_ne_oflow = 0x80, |
- insn_carry_clear = 0x100, |
- insn_zero_clear = 0x200, |
- insn_oflow_clear = 0x400, |
- insn_dir_clear = 0x800, |
- insn_sign_clear = 0x1000, |
- insn_parity_clear = 0x2000, |
- insn_sign_eq_oflow = 0x4000, |
- insn_sign_ne_oflow = 0x8000 |
- }; |
- |
- enum x86_insn_cpu { |
- cpu_8086 = 1, cpu_80286 = 2, |
- cpu_80386 = 3, cpu_80387 = 4, |
- cpu_80486 = 5, cpu_pentium = 6, |
- cpu_pentiumpro = 7, cpu_pentium2 = 8, |
- cpu_pentium3 = 9, cpu_pentium4 = 10, |
- cpu_k6 = 16, cpu_k7 = 32, |
- cpu_athlon = 48 |
- }; |
- |
- enum x86_insn_isa { |
- isa_gp = 1, isa_fp = 2, |
- isa_fpumgt = 3, isa_mmx = 4, |
- isa_sse1 = 5, isa_sse2 = 6, |
- isa_sse3 = 7, isa_3dnow = 8, |
- isa_sys = 9 |
- }; |
- |
- enum x86_insn_prefix { |
- insn_no_prefix = 0, |
- insn_rep_zero = 1, |
- insn_rep_notzero = 2, |
- insn_lock = 4 |
- }; |
- |
- |
- typedef struct { |
- unsigned long addr; |
- unsigned long offset; |
- enum x86_insn_group group; |
- enum x86_insn_type type; |
- enum x86_insn_note note; |
- unsigned char bytes[MAX_INSN_SIZE]; |
- unsigned char size; |
- unsigned char addr_size; |
- unsigned char op_size; |
- enum x86_insn_cpu cpu; |
- enum x86_insn_isa isa; |
- enum x86_flag_status flags_set; |
- enum x86_flag_status flags_tested; |
- unsigned char stack_mod; |
- long stack_mod_val; |
- enum x86_insn_prefix prefix; |
- char prefix_string[MAX_PREFIX_STR]; |
- char mnemonic[MAX_MNEM_STR]; |
- x86_oplist_t *operands; |
- size_t operand_count; |
- size_t explicit_count; |
- void *block; |
- void *function; |
- int tag; |
- } x86_insn_t; |
- |
- typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, |
- void *arg); |
- |
- enum x86_op_foreach_type { |
- op_any = 0, |
- op_dest = 1, |
- op_src = 2, |
- op_ro = 3, |
- op_wo = 4, |
- op_xo = 5, |
- op_rw = 6, |
- op_implicit = 0x10, |
- op_explicit = 0x20 |
- }; |
- |
- size_t x86_operand_count( x86_insn_t *insn, |
- enum x86_op_foreach_type type ); |
- x86_op_t * x86_operand_1st( x86_insn_t *insn ); |
- x86_op_t * x86_operand_2nd( x86_insn_t *insn ); |
- x86_op_t * x86_operand_3rd( x86_insn_t *insn ); |
- long x86_get_rel_offset( x86_insn_t *insn ); |
- x86_op_t * x86_get_branch_target( x86_insn_t *insn ); |
- x86_op_t * x86_get_imm( x86_insn_t *insn ); |
- unsigned char * x86_get_raw_imm( x86_insn_t *insn ); |
- void x86_set_insn_addr( x86_insn_t *insn, unsigned long addr ); |
- int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, |
- enum x86_asm_format format); |
- int x86_format_insn(x86_insn_t *insn, char *buf, int len, |
- enum x86_asm_format); |
- void x86_oplist_free( x86_insn_t *insn ); |
- int x86_insn_is_valid( x86_insn_t *insn ); |
-%} |
- |
-%extend x86_insn_t { |
- x86_insn_t() { |
- x86_insn_t *insn = (x86_insn_t *) |
- calloc( sizeof(x86_insn_t), 1 ); |
- return insn; |
- } |
- ~x86_insn_t() { |
- x86_oplist_free( self ); |
- free( self ); |
- } |
- |
- int is_valid( ) { |
- return x86_insn_is_valid( self ); |
- } |
- |
- x86_op_t * operand_1st() { |
- return x86_operand_1st( self ); |
- } |
- |
- x86_op_t * operand_2nd() { |
- return x86_operand_2nd( self ); |
- } |
- |
- x86_op_t * operand_3rd() { |
- return x86_operand_3rd( self ); |
- } |
- |
- x86_op_t * operand_dest() { |
- return x86_operand_1st( self ); |
- } |
- |
- x86_op_t * operand_src() { |
- return x86_operand_2nd( self ); |
- } |
- |
- size_t num_operands( enum x86_op_foreach_type type ) { |
- return x86_operand_count( self, type ); |
- } |
- |
- long rel_offset() { |
- return x86_get_rel_offset( self ); |
- } |
- |
- x86_op_t * branch_target() { |
- return x86_get_branch_target( self ); |
- } |
- |
- x86_op_t * imm() { |
- return x86_get_imm( self ); |
- } |
- |
- unsigned char * raw_imm() { |
- return x86_get_raw_imm( self ); |
- } |
- |
- %newobject format; |
- char * format( enum x86_asm_format format ) { |
- char *buf, *str; |
- size_t len; |
- |
- switch ( format ) { |
- case xml_syntax: |
- len = MAX_INSN_XML_STRING; |
- break; |
- case raw_syntax: |
- len = MAX_INSN_RAW_STRING; |
- break; |
- case native_syntax: |
- case intel_syntax: |
- case att_syntax: |
- case unknown_syntax: |
- default: |
- len = MAX_INSN_STRING; |
- break; |
- } |
- |
- buf = (char * ) calloc( len + 1, 1 ); |
- x86_format_insn( self, buf, len, format ); |
- |
- /* drop buffer down to a reasonable size */ |
- str = strdup( buf ); |
- free(buf); |
- return str; |
- } |
- |
- %newobject format_mnemonic; |
- char * format_mnemonic( enum x86_asm_format format ) { |
- char *buf, *str; |
- size_t len = MAX_MNEM_STR + MAX_PREFIX_STR + 4; |
- |
- buf = (char * ) calloc( len, 1 ); |
- x86_format_mnemonic( self, buf, len, format ); |
- |
- /* drop buffer down to a reasonable size */ |
- str = strdup( buf ); |
- free(buf); |
- |
- return str; |
- } |
- |
- %newobject copy; |
- x86_insn_t * copy() { |
- x86_oplist_t *ptr, *list, *last = NULL; |
- x86_insn_t *insn = (x86_insn_t *) |
- calloc( sizeof(x86_insn_t), 1 ); |
- |
- if ( insn ) { |
- memcpy( insn, self, sizeof(x86_insn_t) ); |
- insn->operands = NULL; |
- insn->block = NULL; |
- insn->function = NULL; |
- |
- /* copy operand list */ |
- for ( list = self->operands; list; list = list->next ) { |
- ptr = x86_oplist_node_copy( list ); |
- |
- if (! ptr ) { |
- continue; |
- } |
- |
- if ( insn->operands ) { |
- last->next = ptr; |
- } else { |
- insn->operands = ptr; |
- } |
- last = ptr; |
- } |
- } |
- |
- return insn; |
- } |
- |
- X86_OpList * operand_list( ) { |
- x86_oplist_t *list = self->operands; |
- X86_OpList *op_list = new_X86_OpList(); |
- |
- for ( list = self->operands; list; list = list->next ) { |
- X86_OpList_append( op_list, &list->op ); |
- } |
- |
- return op_list; |
- } |
-} |
- |
-/* ================================================================== */ |
-/* invariant instruction class */ |
-%inline %{ |
- #define X86_WILDCARD_BYTE 0xF4 |
- |
- typedef struct { |
- enum x86_op_type type; |
- enum x86_op_datatype datatype; |
- enum x86_op_access access; |
- enum x86_op_flags flags; |
- } x86_invariant_op_t; |
- |
- typedef struct { |
- unsigned char bytes[64]; |
- unsigned int size; |
- enum x86_insn_group group; |
- enum x86_insn_type type; |
- x86_invariant_op_t operands[3]; |
- } x86_invariant_t; |
-%} |
- |
-%extend x86_invariant_t { |
- |
- x86_invariant_t() { |
- x86_invariant_t *inv = (x86_invariant_t *) |
- calloc( sizeof(x86_invariant_t), 1 ); |
- return inv; |
- } |
- |
- ~x86_invariant_t() { |
- free( self ); |
- } |
-} |
- |
-/* ================================================================== */ |
-/* instruction list class */ |
-%inline %{ |
- typedef struct X86_InsnListNode { |
- x86_insn_t *insn; |
- struct X86_InsnListNode *next, *prev; |
- } X86_InsnListNode; |
- |
- typedef struct X86_InsnList { |
- size_t count; |
- X86_InsnListNode *head, *tail, *curr; |
- } X86_InsnList; |
-%} |
- |
-%extend X86_InsnList { |
- X86_InsnList () { |
- X86_InsnList *list = (X86_InsnList *) |
- calloc( sizeof(X86_InsnList), 1 ); |
- list->count = 0; |
- return list; |
- } |
- |
- ~X86_InsnList() { |
- X86_InsnListNode *node, *next; |
- |
- node = self->head; |
- while ( node ) { |
- next = node->next; |
- /* free( node->insn ); */ |
- free( node ); |
- node = next; |
- } |
- |
- free( self ); |
- } |
- |
- X86_InsnListNode * first() { return self->head; } |
- |
- X86_InsnListNode * last() { return self->tail; } |
- |
- X86_InsnListNode * next() { |
- if (! self->curr ) { |
- self->curr = self->head; |
- return self->head; |
- } |
- |
- self->curr = self->curr->next; |
- return self->curr; |
- } |
- |
- X86_InsnListNode * prev() { |
- if (! self->curr ) { |
- self->curr = self->tail; |
- return self->tail; |
- } |
- |
- self->curr = self->curr->prev; |
- return self->curr; |
- } |
- |
- %newobject append; |
- void append( x86_insn_t *insn ) { |
- X86_InsnListNode *node = (X86_InsnListNode *) |
- calloc( sizeof(X86_InsnListNode) , 1 ); |
- if (! node ) { |
- return; |
- } |
- |
- self->count++; |
- if ( ! self->tail ) { |
- self->head = self->tail = node; |
- } else { |
- self->tail->next = node; |
- node->prev = self->tail; |
- self->tail = node; |
- } |
- |
- node->insn = x86_insn_t_copy( insn ); |
- } |
-} |
- |
-/* ================================================================== */ |
-/* address table class */ |
-/* slight TODO */ |
- |
-/* ================================================================== */ |
-/* Main disassembler class */ |
-%inline %{ |
- |
- enum x86_options { |
- opt_none= 0, |
- opt_ignore_nulls=1, |
- opt_16_bit=2 |
- }; |
- enum x86_report_codes { |
- report_disasm_bounds, |
- report_insn_bounds, |
- report_invalid_insn, |
- report_unknown |
- }; |
- |
- |
- typedef struct { |
- enum x86_report_codes last_error; |
- void * last_error_data; |
- void * disasm_callback; |
- void * disasm_resolver; |
- } X86_Disasm; |
- |
- typedef void (*DISASM_REPORTER)( enum x86_report_codes code, |
- void *data, void *arg ); |
- typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg ); |
- typedef long (*DISASM_RESOLVER)( x86_op_t *op, |
- x86_insn_t * current_insn, |
- void *arg ); |
- |
- void x86_report_error( enum x86_report_codes code, void *data ); |
- int x86_init( enum x86_options options, DISASM_REPORTER reporter, |
- void *arg); |
- void x86_set_reporter( DISASM_REPORTER reporter, void *arg); |
- void x86_set_options( enum x86_options options ); |
- enum x86_options x86_get_options( void ); |
- int x86_cleanup(void); |
- int x86_format_header( char *buf, int len, enum x86_asm_format format); |
- unsigned int x86_endian(void); |
- unsigned int x86_addr_size(void); |
- unsigned int x86_op_size(void); |
- unsigned int x86_word_size(void); |
- unsigned int x86_max_insn_size(void); |
- unsigned int x86_sp_reg(void); |
- unsigned int x86_fp_reg(void); |
- unsigned int x86_ip_reg(void); |
- size_t x86_invariant_disasm( unsigned char *buf, int buf_len, |
- x86_invariant_t *inv ); |
- size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ); |
- int x86_disasm( unsigned char *buf, unsigned int buf_len, |
- unsigned long buf_rva, unsigned int offset, |
- x86_insn_t * insn ); |
- int x86_disasm_range( unsigned char *buf, unsigned long buf_rva, |
- unsigned int offset, unsigned int len, |
- DISASM_CALLBACK func, void *arg ); |
- int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, |
- unsigned long buf_rva, unsigned int offset, |
- DISASM_CALLBACK func, void *arg, |
- DISASM_RESOLVER resolver, void *r_arg ); |
- |
- void x86_default_reporter( enum x86_report_codes code, |
- void *data, void *arg ) { |
- X86_Disasm *dis = (X86_Disasm *) arg; |
- if ( dis ) { |
- dis->last_error = code; |
- dis->last_error_data = data; |
- } |
- } |
- |
- void x86_default_callback( x86_insn_t *insn, void *arg ) { |
- X86_InsnList *list = (X86_InsnList *) arg; |
- if ( list ) { |
- X86_InsnList_append( list, insn ); |
- } |
- } |
- |
- /* TODO: resolver stack, maybe a callback */ |
- long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { |
- X86_Disasm *dis = (X86_Disasm *) arg; |
- if ( dis ) { |
- //return dis->resolver( op, insn ); |
- return 0; |
- } |
- |
- return 0; |
- } |
- |
-%} |
- |
-%extend X86_Disasm { |
- |
- X86_Disasm( ) { |
- X86_Disasm * dis = (X86_Disasm *) |
- calloc( sizeof( X86_Disasm ), 1 ); |
- x86_init( opt_none, x86_default_reporter, dis ); |
- return dis; |
- } |
- |
- X86_Disasm( enum x86_options options ) { |
- X86_Disasm * dis = (X86_Disasm *) |
- calloc( sizeof( X86_Disasm ), 1 ); |
- x86_init( options, x86_default_reporter, dis ); |
- return dis; |
- } |
- |
- X86_Disasm( enum x86_options options, DISASM_REPORTER reporter ) { |
- X86_Disasm * dis = (X86_Disasm *) |
- calloc( sizeof( X86_Disasm ), 1 ); |
- x86_init( options, reporter, NULL ); |
- return dis; |
- } |
- |
- X86_Disasm( enum x86_options options, DISASM_REPORTER reporter, |
- void * arg ) { |
- X86_Disasm * dis = (X86_Disasm *) |
- calloc( sizeof( X86_Disasm ), 1 ); |
- x86_init( options, reporter, arg ); |
- return dis; |
- } |
- |
- ~X86_Disasm() { |
- x86_cleanup(); |
- free( self ); |
- } |
- |
- void set_options( enum x86_options options ) { |
- return x86_set_options( options ); |
- } |
- |
- enum x86_options options() { |
- return x86_get_options(); |
- } |
- |
- void set_callback( void * callback ) { |
- self->disasm_callback = callback; |
- } |
- |
- void set_resolver( void * callback ) { |
- self->disasm_resolver = callback; |
- } |
- |
- void report_error( enum x86_report_codes code ) { |
- x86_report_error( code, NULL ); |
- } |
- |
- %newobject disasm; |
- x86_insn_t * disasm( unsigned char *buf, size_t buf_len, |
- unsigned long buf_rva, unsigned int offset ) { |
- x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); |
- x86_disasm( buf, buf_len, buf_rva, offset, insn ); |
- return insn; |
- } |
- |
- int disasm_range( unsigned char *buf, size_t buf_len, |
- unsigned long buf_rva, unsigned int offset, |
- unsigned int len ) { |
- |
- X86_InsnList *list = new_X86_InsnList(); |
- |
- if ( len > buf_len ) { |
- len = buf_len; |
- } |
- |
- return x86_disasm_range( buf, buf_rva, offset, len, |
- x86_default_callback, list ); |
- } |
- |
- int disasm_forward( unsigned char *buf, size_t buf_len, |
- unsigned long buf_rva, unsigned int offset ) { |
- X86_InsnList *list = new_X86_InsnList(); |
- |
- /* use default resolver: damn SWIG callbacks! */ |
- return x86_disasm_forward( buf, buf_len, buf_rva, offset, |
- x86_default_callback, list, |
- x86_default_resolver, NULL ); |
- } |
- |
- size_t disasm_invariant( unsigned char *buf, size_t buf_len, |
- x86_invariant_t *inv ) { |
- return x86_invariant_disasm( buf, buf_len, inv ); |
- } |
- |
- size_t disasm_size( unsigned char *buf, size_t buf_len ) { |
- return x86_size_disasm( buf, buf_len ); |
- } |
- |
- %newobject format_header; |
- char * format_header( enum x86_asm_format format) { |
- char *buf, *str; |
- size_t len; |
- |
- switch ( format ) { |
- /* these were obtained from x86_format.c */ |
- case xml_syntax: |
- len = 679; break; |
- case raw_syntax: |
- len = 172; break; |
- case native_syntax: |
- len = 35; break; |
- case intel_syntax: |
- len = 23; break; |
- case att_syntax: |
- len = 23; break; |
- case unknown_syntax: |
- default: |
- len = 23; break; |
- } |
- |
- buf = (char * ) calloc( len + 1, 1 ); |
- x86_format_header( buf, len, format ); |
- |
- return buf; |
- } |
- |
- unsigned int endian() { |
- return x86_endian(); |
- } |
- |
- unsigned int addr_size() { |
- return x86_addr_size(); |
- } |
- |
- unsigned int op_size() { |
- return x86_op_size(); |
- } |
- |
- unsigned int word_size() { |
- return x86_word_size(); |
- } |
- |
- unsigned int max_insn_size() { |
- return x86_max_insn_size(); |
- } |
- |
- unsigned int sp_reg() { |
- return x86_sp_reg(); |
- } |
- |
- unsigned int fp_reg() { |
- return x86_fp_reg(); |
- } |
- |
- unsigned int ip_reg() { |
- return x86_ip_reg(); |
- } |
- |
- %newobject reg_from_id; |
- x86_reg_t * reg_from_id( unsigned int id ) { |
- x86_reg_t * reg = calloc( sizeof(x86_reg_t), 1 ); |
- x86_reg_from_id( id, reg ); |
- return reg; |
- } |
- |
- unsigned char wildcard_byte() { return X86_WILDCARD_BYTE; } |
- |
- int max_register_string() { return MAX_REGNAME; } |
- |
- int max_prefix_string() { return MAX_PREFIX_STR; } |
- |
- int max_mnemonic_string() { return MAX_MNEM_STR; } |
- |
- int max_operand_string( enum x86_asm_format format ) { |
- switch ( format ) { |
- case xml_syntax: |
- return MAX_OP_XML_STRING; |
- break; |
- case raw_syntax: |
- return MAX_OP_RAW_STRING; |
- break; |
- case native_syntax: |
- case intel_syntax: |
- case att_syntax: |
- case unknown_syntax: |
- default: |
- return MAX_OP_STRING; |
- break; |
- } |
- } |
- |
- |
- int max_insn_string( enum x86_asm_format format ) { |
- switch ( format ) { |
- case xml_syntax: |
- return MAX_INSN_XML_STRING; |
- break; |
- case raw_syntax: |
- return MAX_INSN_RAW_STRING; |
- break; |
- case native_syntax: |
- case intel_syntax: |
- case att_syntax: |
- case unknown_syntax: |
- default: |
- return MAX_INSN_STRING; |
- break; |
- } |
- } |
- |
- int max_num_operands( ) { return MAX_NUM_OPERANDS; } |
-} |
- |
-/* python callback, per the manual */ |
-/*%typemap(python,in) PyObject *pyfunc { |
- if (!PyCallable_Check($source)) { |
- PyErr_SetString(PyExc_TypeError, "Need a callable object!"); |
- return NULL; |
- } |
- $target = $source; |
-}*/ |
- |
-/* python FILE * callback, per the manual */ |
-/* |
-%typemap(python,in) FILE * { |
- if (!PyFile_Check($source)) { |
- PyErr_SetString(PyExc_TypeError, "Need a file!"); |
- return NULL; |
- } |
- $target = PyFile_AsFile($source); |
-}*/ |
- |
- |