12b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%module x86disasm 22b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%{ 32b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#ifdef _MSC_VER 42b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef __int64 qword; 52b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#else 62b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef long long qword; 72b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#endif 82b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 92b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include <sys/types.h> 102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_REGNAME 8 122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_PREFIX_STR 32 132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_MNEM_STR 16 142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_SIZE 20 152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_OP_STRING 32 162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_OP_RAW_STRING 64 172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_OP_XML_STRING 256 182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_NUM_OPERANDS 8 192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_STRING 512 202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_RAW_STRING 1024 212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#define MAX_INSN_XML_STRING 4096 222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "../../../config.h" 242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgconst char * version_string( void ) { 272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return PACKAGE_VERSION; 282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgconst char * version_string( void ); 332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Register) x86_reg_t; 352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_EAddr) x86_ea_t; 362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Operand) x86_op_t; 372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org//%rename(X86_OpList) x86_oplist_t; 382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Insn) x86_insn_t; 392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_InvOperand) x86_invariant_op_t; 402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(X86_Invariant) x86_invariant_t; 412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%include "carrays.i" 432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%array_class( unsigned char, byteArray ); 452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%apply (unsigned char *STRING, int LENGTH) { 482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org (unsigned char *buf, size_t buf_len) 492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}; 502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.orgenum x86_asm_format { 562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unknown_syntax = 0, /* never use! */ 572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org native_syntax, /* header: 35 bytes */ 582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org intel_syntax, /* header: 23 bytes */ 592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org att_syntax, /* header: 23 bytes */ 602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org xml_syntax, /* header: 679 bytes */ 612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org raw_syntax /* header: 172 bytes */ 622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}; 632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* operand class */ 672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_reg_type { 692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_gen = 0x00001, reg_in = 0x00002, 702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_out = 0x00004, reg_local = 0x00008, 712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_fpu = 0x00010, reg_seg = 0x00020, 722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_simd = 0x00040, reg_sys = 0x00080, 732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_sp = 0x00100, reg_fp = 0x00200, 742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_pc = 0x00400, reg_retaddr = 0x00800, 752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_cond = 0x01000, reg_zero = 0x02000, 762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_ret = 0x04000, reg_src = 0x10000, 772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org reg_dest = 0x20000, reg_count = 0x40000 782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char name[MAX_REGNAME]; 822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_reg_type type; 832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int size; 842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int id; 852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int alias; 862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int shift; 872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_reg_t; 882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_reg_from_id( unsigned int id, x86_reg_t * reg ); 902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int scale; 932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_t index, base; 942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long disp; 952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char disp_sign; 962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char disp_size; 972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_ea_t; 982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_type { 1002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_unused = 0, 1012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_register = 1, 1022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_immediate = 2, 1032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_relative_near = 3, 1042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_relative_far = 4, 1052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_absolute = 5, 1062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_expression = 6, 1072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_offset = 7, 1082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_unknown 1092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 1102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_datatype { 1122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_byte = 1, op_word = 2, 1132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_dword = 3, op_qword = 4, 1142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_dqword = 5, op_sreal = 6, 1152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_dreal = 7, op_extreal = 8, 1162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_bcd = 9, op_ssimd = 10, 1172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_dsimd = 11, op_sssimd = 12, 1182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_sdsimd = 13, op_descr32 = 14, 1192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_descr16 = 15, op_pdescr32 = 16, 1202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_pdescr16 = 17, op_fpuenv = 18, 1212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_fpregset = 19, 1222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 1232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_access { 1252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_read = 1, 1262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_write = 2, 1272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_execute = 4 1282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 1292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_flags { 1312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_signed = 1, op_string = 2, 1322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_constant = 4, op_pointer = 8, 1332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_sysref = 0x010, op_implied = 0x020, 1342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_hardcode = 0x40, op_es_seg = 0x100, 1352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_cs_seg = 0x200, op_ss_seg = 0x300, 1362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_ds_seg = 0x400, op_fs_seg = 0x500, 1372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_gs_seg = 0x600 1382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 1392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 1412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_type type; 1422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_datatype datatype; 1432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_access access; 1442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_flags flags; 1452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org union { 1462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char sbyte; 1472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org short sword; 1482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long sdword; 1492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org qword sqword; 1502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char byte; 1512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned short word; 1522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long dword; 1532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org qword qword; 1542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org float sreal; 1552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org double dreal; 1562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char extreal[10]; 1572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char bcd[10]; 1582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org qword dqword[2]; 1592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char simd[16]; 1602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char fpuenv[28]; 1612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * address; 1622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long offset; 1632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_t reg; 1642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char relative_near; 1652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long relative_far; 1662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_ea_t expression; 1672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } data; 1682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * insn; 1692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_op_t; 1702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_operand_size( x86_op_t *op ); 1722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_format_operand(x86_op_t *op, char *buf, int len, 1742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_asm_format format); 1752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 1762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_reg_t{ 1782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_t * aliased_reg( ) { 1792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_t * reg = (x86_reg_t * ) 1802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_reg_t), 1 ); 1812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_from_id( self->id, reg ); 1822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return reg; 1832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 1852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_op_t{ 1872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t size() { 1882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_size( self ); 1892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char * format( enum x86_asm_format format ) { 1912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char *buf, *str; 1922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t len; 1932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 1952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 1962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = MAX_OP_XML_STRING; 1972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 1982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 1992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = MAX_OP_RAW_STRING; 2002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 2012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 2022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 2032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 2042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 2052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 2062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = MAX_OP_STRING; 2072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 2082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org buf = (char * ) calloc( len + 1, 1 ); 2112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_format_operand( self, buf, len, format ); 2122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* drop buffer down to a reasonable size */ 2142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org str = strdup( buf ); 2152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free(buf); 2162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return str; 2172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int is_address( ) { 2202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( self->type == op_absolute || 2212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->type == op_offset ) { 2222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 1; 2232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 0; 2262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int is_relative( ) { 2292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( self->type == op_relative_near || 2302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->type == op_relative_far ) { 2312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 1; 2322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 0; 2352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject copy; 2382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * copy() { 2392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t *op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); 2402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( op ) { 2422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org memcpy( op, self, sizeof(x86_op_t) ); 2432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return op; 2462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 2482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 2502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* operand list class */ 2512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 2522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct X86_OpListNode { 2532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t *op; 2542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org struct X86_OpListNode *next, *prev; 2552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } X86_OpListNode; 2562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct X86_OpList { 2582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t count; 2592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode *head, *tail, *curr; 2602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } X86_OpList; 2612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 2622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend X86_OpList { 2642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpList () { 2652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpList *list = (X86_OpList *) 2662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(X86_OpList), 1 ); 2672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->count = 0; 2682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list; 2692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ~X86_OpList() { 2722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode *node, *next; 2732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = self->head; 2752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org while ( node ) { 2762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org next = node->next; 2772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* free( node->insn ); */ 2782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( node ); 2792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = next; 2802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( self ); 2832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode * first() { 2862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->head; 2872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->head; 2882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode * last() { 2912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->tail; 2922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->tail; 2932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode * next() { 2962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! self->curr ) { 2972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->head; 2982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->head; 2992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->curr->next; 3022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->curr; 3032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode * prev() { 3062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! self->curr ) { 3072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->tail; 3082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->tail; 3092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->curr->prev; 3122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->curr; 3132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject append; 3162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void append( x86_op_t *op ) { 3172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpListNode *node = (X86_OpListNode *) 3182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(X86_OpListNode) , 1 ); 3192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! node ) { 3202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return; 3212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->count++; 3242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( ! self->tail ) { 3252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->head = self->tail = node; 3262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } else { 3272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->tail->next = node; 3282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->prev = self->tail; 3292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->tail = node; 3302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->op = x86_op_t_copy( op ); 3332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 3352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 3372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct x86_operand_list { 3382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t op; 3392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org struct x86_operand_list *next; 3402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_oplist_t; 3412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 3422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_oplist_t { 3442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject x86_oplist_node_copy; 3452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 3462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 3482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* instruction class */ 3492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 3502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t * x86_oplist_node_copy( x86_oplist_t * list ) { 3512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *ptr; 3522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); 3532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( ptr ) { 3542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); 3552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return ptr; 3582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_group { 3612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_none = 0, insn_controlflow = 1, 3622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_arithmetic = 2, insn_logic = 3, 3632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_stack = 4, insn_comparison = 5, 3642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_move = 6, insn_string = 7, 3652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_bit_manip = 8, insn_flag_manip = 9, 3662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fpu = 10, insn_interrupt = 13, 3672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_system = 14, insn_other = 15 3682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 3692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_type { 3712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_invalid = 0, insn_jmp = 0x1001, 3722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_jcc = 0x1002, insn_call = 0x1003, 3732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_callcc = 0x1004, insn_return = 0x1005, 3742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_add = 0x2001, insn_sub = 0x2002, 3752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_mul = 0x2003, insn_div = 0x2004, 3762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_inc = 0x2005, insn_dec = 0x2006, 3772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_shl = 0x2007, insn_shr = 0x2008, 3782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_rol = 0x2009, insn_ror = 0x200A, 3792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_and = 0x3001, insn_or = 0x3002, 3802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_xor = 0x3003, insn_not = 0x3004, 3812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_neg = 0x3005, insn_push = 0x4001, 3822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_pop = 0x4002, insn_pushregs = 0x4003, 3832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_popregs = 0x4004, insn_pushflags = 0x4005, 3842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_popflags = 0x4006, insn_enter = 0x4007, 3852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_leave = 0x4008, insn_test = 0x5001, 3862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_cmp = 0x5002, insn_mov = 0x6001, 3872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_movcc = 0x6002, insn_xchg = 0x6003, 3882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_xchgcc = 0x6004, insn_strcmp = 0x7001, 3892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_strload = 0x7002, insn_strmov = 0x7003, 3902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_strstore = 0x7004, insn_translate = 0x7005, 3912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_bittest = 0x8001, insn_bitset = 0x8002, 3922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_bitclear = 0x8003, insn_clear_carry = 0x9001, 3932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_clear_zero = 0x9002, insn_clear_oflow = 0x9003, 3942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_clear_dir = 0x9004, insn_clear_sign = 0x9005, 3952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_clear_parity = 0x9006, insn_set_carry = 0x9007, 3962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_set_zero = 0x9008, insn_set_oflow = 0x9009, 3972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_set_dir = 0x900A, insn_set_sign = 0x900B, 3982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_set_parity = 0x900C, insn_tog_carry = 0x9010, 3992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_tog_zero = 0x9020, insn_tog_oflow = 0x9030, 4002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_tog_dir = 0x9040, insn_tog_sign = 0x9050, 4012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_tog_parity = 0x9060, insn_fmov = 0xA001, 4022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fmovcc = 0xA002, insn_fneg = 0xA003, 4032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fabs = 0xA004, insn_fadd = 0xA005, 4042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fsub = 0xA006, insn_fmul = 0xA007, 4052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fdiv = 0xA008, insn_fsqrt = 0xA009, 4062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fcmp = 0xA00A, insn_fcos = 0xA00C, 4072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fldpi = 0xA00D, insn_fldz = 0xA00E, 4082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_ftan = 0xA00F, insn_fsine = 0xA010, 4092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_fsys = 0xA020, insn_int = 0xD001, 4102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_intcc = 0xD002, insn_iret = 0xD003, 4112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_bound = 0xD004, insn_debug = 0xD005, 4122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_trace = 0xD006, insn_invalid_op = 0xD007, 4132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_oflow = 0xD008, insn_halt = 0xE001, 4142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_in = 0xE002, insn_out = 0xE003, 4152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_cpuid = 0xE004, insn_nop = 0xF001, 4162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_bcdconv = 0xF002, insn_szconv = 0xF003 4172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 4182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_note { 4202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_note_ring0 = 1, 4212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_note_smm = 2, 4222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_note_serial = 4 4232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 4242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_flag_status { 4262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_carry_set = 0x1, 4272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_zero_set = 0x2, 4282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_oflow_set = 0x4, 4292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_dir_set = 0x8, 4302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_sign_set = 0x10, 4312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_parity_set = 0x20, 4322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_carry_or_zero_set = 0x40, 4332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_zero_set_or_sign_ne_oflow = 0x80, 4342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_carry_clear = 0x100, 4352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_zero_clear = 0x200, 4362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_oflow_clear = 0x400, 4372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_dir_clear = 0x800, 4382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_sign_clear = 0x1000, 4392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_parity_clear = 0x2000, 4402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_sign_eq_oflow = 0x4000, 4412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_sign_ne_oflow = 0x8000 4422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 4432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_cpu { 4452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_8086 = 1, cpu_80286 = 2, 4462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_80386 = 3, cpu_80387 = 4, 4472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_80486 = 5, cpu_pentium = 6, 4482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_pentiumpro = 7, cpu_pentium2 = 8, 4492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_pentium3 = 9, cpu_pentium4 = 10, 4502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_k6 = 16, cpu_k7 = 32, 4512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org cpu_athlon = 48 4522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 4532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_isa { 4552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org isa_gp = 1, isa_fp = 2, 4562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org isa_fpumgt = 3, isa_mmx = 4, 4572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org isa_sse1 = 5, isa_sse2 = 6, 4582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org isa_sse3 = 7, isa_3dnow = 8, 4592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org isa_sys = 9 4602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 4612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_prefix { 4632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_no_prefix = 0, 4642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_rep_zero = 1, 4652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_rep_notzero = 2, 4662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn_lock = 4 4672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 4682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 4712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long addr; 4722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long offset; 4732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_group group; 4742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_type type; 4752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_note note; 4762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char bytes[MAX_INSN_SIZE]; 4772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char size; 4782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char addr_size; 4792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char op_size; 4802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_cpu cpu; 4812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_isa isa; 4822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_flag_status flags_set; 4832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_flag_status flags_tested; 4842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char stack_mod; 4852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long stack_mod_val; 4862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_prefix prefix; 4872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char prefix_string[MAX_PREFIX_STR]; 4882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char mnemonic[MAX_MNEM_STR]; 4892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *operands; 4902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t operand_count; 4912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t explicit_count; 4922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *block; 4932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *function; 4942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int tag; 4952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_insn_t; 4962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, 4982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *arg); 4992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_foreach_type { 5012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_any = 0, 5022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_dest = 1, 5032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_src = 2, 5042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_ro = 3, 5052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_wo = 4, 5062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_xo = 5, 5072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_rw = 6, 5082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_implicit = 0x10, 5092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op_explicit = 0x20 5102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 5112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t x86_operand_count( x86_insn_t *insn, 5132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_foreach_type type ); 5142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * x86_operand_1st( x86_insn_t *insn ); 5152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * x86_operand_2nd( x86_insn_t *insn ); 5162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * x86_operand_3rd( x86_insn_t *insn ); 5172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long x86_get_rel_offset( x86_insn_t *insn ); 5182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * x86_get_branch_target( x86_insn_t *insn ); 5192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * x86_get_imm( x86_insn_t *insn ); 5202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char * x86_get_raw_imm( x86_insn_t *insn ); 5212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_set_insn_addr( x86_insn_t *insn, unsigned long addr ); 5222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, 5232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_asm_format format); 5242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_format_insn(x86_insn_t *insn, char *buf, int len, 5252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_asm_format); 5262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_oplist_free( x86_insn_t *insn ); 5272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_insn_is_valid( x86_insn_t *insn ); 5282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 5292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_insn_t { 5312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t() { 5322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn = (x86_insn_t *) 5332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_insn_t), 1 ); 5342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return insn; 5352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ~x86_insn_t() { 5372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_free( self ); 5382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( self ); 5392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int is_valid( ) { 5422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_insn_is_valid( self ); 5432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * operand_1st() { 5462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_1st( self ); 5472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * operand_2nd() { 5502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_2nd( self ); 5512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * operand_3rd() { 5542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_3rd( self ); 5552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * operand_dest() { 5582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_1st( self ); 5592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * operand_src() { 5622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_2nd( self ); 5632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t num_operands( enum x86_op_foreach_type type ) { 5662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_operand_count( self, type ); 5672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long rel_offset() { 5702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_get_rel_offset( self ); 5712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * branch_target() { 5742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_get_branch_target( self ); 5752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * imm() { 5782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_get_imm( self ); 5792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char * raw_imm() { 5822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_get_raw_imm( self ); 5832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject format; 5862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char * format( enum x86_asm_format format ) { 5872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char *buf, *str; 5882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t len; 5892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 5912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 5922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = MAX_INSN_XML_STRING; 5932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 5942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 5952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = MAX_INSN_RAW_STRING; 5962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 5972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 5982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 5992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 6002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 6012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 6022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = MAX_INSN_STRING; 6032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 6042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org buf = (char * ) calloc( len + 1, 1 ); 6072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_format_insn( self, buf, len, format ); 6082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* drop buffer down to a reasonable size */ 6102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org str = strdup( buf ); 6112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free(buf); 6122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return str; 6132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject format_mnemonic; 6162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char * format_mnemonic( enum x86_asm_format format ) { 6172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char *buf, *str; 6182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t len = MAX_MNEM_STR + MAX_PREFIX_STR + 4; 6192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org buf = (char * ) calloc( len, 1 ); 6212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_format_mnemonic( self, buf, len, format ); 6222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* drop buffer down to a reasonable size */ 6242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org str = strdup( buf ); 6252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free(buf); 6262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return str; 6282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject copy; 6312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * copy() { 6322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *ptr, *list, *last = NULL; 6332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn = (x86_insn_t *) 6342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_insn_t), 1 ); 6352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( insn ) { 6372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org memcpy( insn, self, sizeof(x86_insn_t) ); 6382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->operands = NULL; 6392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->block = NULL; 6402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->function = NULL; 6412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* copy operand list */ 6432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org for ( list = self->operands; list; list = list->next ) { 6442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ptr = x86_oplist_node_copy( list ); 6452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! ptr ) { 6472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org continue; 6482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( insn->operands ) { 6512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org last->next = ptr; 6522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } else { 6532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->operands = ptr; 6542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org last = ptr; 6562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return insn; 6602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpList * operand_list( ) { 6632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *list = self->operands; 6642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpList *op_list = new_X86_OpList(); 6652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org for ( list = self->operands; list; list = list->next ) { 6672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_OpList_append( op_list, &list->op ); 6682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return op_list; 6712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 6722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 6732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 6752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* invariant instruction class */ 6762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 6772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org #define X86_WILDCARD_BYTE 0xF4 6782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 6802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_type type; 6812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_datatype datatype; 6822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_access access; 6832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_op_flags flags; 6842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_invariant_op_t; 6852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 6872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char bytes[64]; 6882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int size; 6892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_group group; 6902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_insn_type type; 6912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_invariant_op_t operands[3]; 6922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_invariant_t; 6932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 6942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend x86_invariant_t { 6962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 6972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_invariant_t() { 6982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_invariant_t *inv = (x86_invariant_t *) 6992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_invariant_t), 1 ); 7002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return inv; 7012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ~x86_invariant_t() { 7042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( self ); 7052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 7072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 7092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* instruction list class */ 7102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 7112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct X86_InsnListNode { 7122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn; 7132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org struct X86_InsnListNode *next, *prev; 7142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } X86_InsnListNode; 7152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct X86_InsnList { 7172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t count; 7182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode *head, *tail, *curr; 7192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } X86_InsnList; 7202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 7212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend X86_InsnList { 7232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnList () { 7242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnList *list = (X86_InsnList *) 7252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(X86_InsnList), 1 ); 7262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->count = 0; 7272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list; 7282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ~X86_InsnList() { 7312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode *node, *next; 7322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = self->head; 7342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org while ( node ) { 7352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org next = node->next; 7362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* free( node->insn ); */ 7372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( node ); 7382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = next; 7392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( self ); 7422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode * first() { return self->head; } 7452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode * last() { return self->tail; } 7472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode * next() { 7492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! self->curr ) { 7502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->head; 7512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->head; 7522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->curr->next; 7552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->curr; 7562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode * prev() { 7592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! self->curr ) { 7602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->tail; 7612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->tail; 7622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->curr = self->curr->prev; 7652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return self->curr; 7662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject append; 7692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void append( x86_insn_t *insn ) { 7702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnListNode *node = (X86_InsnListNode *) 7712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(X86_InsnListNode) , 1 ); 7722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! node ) { 7732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return; 7742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->count++; 7772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( ! self->tail ) { 7782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->head = self->tail = node; 7792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } else { 7802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->tail->next = node; 7812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->prev = self->tail; 7822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->tail = node; 7832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->insn = x86_insn_t_copy( insn ); 7862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 7872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 7882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 7902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* address table class */ 7912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* slight TODO */ 7922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* ================================================================== */ 7942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* Main disassembler class */ 7952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 7962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 7972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_options { 7982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org opt_none= 0, 7992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org opt_ignore_nulls=1, 8002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org opt_16_bit=2 8012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 8022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_report_codes { 8032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org report_disasm_bounds, 8042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org report_insn_bounds, 8052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org report_invalid_insn, 8062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org report_unknown 8072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org }; 8082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 8112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_report_codes last_error; 8122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * last_error_data; 8132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * disasm_callback; 8142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * disasm_resolver; 8152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } X86_Disasm; 8162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef void (*DISASM_REPORTER)( enum x86_report_codes code, 8182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *data, void *arg ); 8192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg ); 8202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef long (*DISASM_RESOLVER)( x86_op_t *op, 8212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * current_insn, 8222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *arg ); 8232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_report_error( enum x86_report_codes code, void *data ); 8252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_init( enum x86_options options, DISASM_REPORTER reporter, 8262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *arg); 8272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_set_reporter( DISASM_REPORTER reporter, void *arg); 8282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_set_options( enum x86_options options ); 8292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_options x86_get_options( void ); 8302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_cleanup(void); 8312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_format_header( char *buf, int len, enum x86_asm_format format); 8322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_endian(void); 8332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_addr_size(void); 8342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_op_size(void); 8352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_word_size(void); 8362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_max_insn_size(void); 8372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_sp_reg(void); 8382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_fp_reg(void); 8392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int x86_ip_reg(void); 8402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t x86_invariant_disasm( unsigned char *buf, int buf_len, 8412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_invariant_t *inv ); 8422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ); 8432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_disasm( unsigned char *buf, unsigned int buf_len, 8442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset, 8452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * insn ); 8462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_disasm_range( unsigned char *buf, unsigned long buf_rva, 8472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int offset, unsigned int len, 8482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org DISASM_CALLBACK func, void *arg ); 8492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, 8502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset, 8512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org DISASM_CALLBACK func, void *arg, 8522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org DISASM_RESOLVER resolver, void *r_arg ); 8532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_default_reporter( enum x86_report_codes code, 8552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *data, void *arg ) { 8562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm *dis = (X86_Disasm *) arg; 8572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( dis ) { 8582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org dis->last_error = code; 8592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org dis->last_error_data = data; 8602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_default_callback( x86_insn_t *insn, void *arg ) { 8642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnList *list = (X86_InsnList *) arg; 8652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( list ) { 8662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnList_append( list, insn ); 8672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* TODO: resolver stack, maybe a callback */ 8712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { 8722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm *dis = (X86_Disasm *) arg; 8732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( dis ) { 8742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org //return dis->resolver( op, insn ); 8752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 0; 8762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 0; 8792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 8822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%extend X86_Disasm { 8842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm( ) { 8862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm * dis = (X86_Disasm *) 8872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof( X86_Disasm ), 1 ); 8882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_init( opt_none, x86_default_reporter, dis ); 8892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return dis; 8902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm( enum x86_options options ) { 8932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm * dis = (X86_Disasm *) 8942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof( X86_Disasm ), 1 ); 8952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_init( options, x86_default_reporter, dis ); 8962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return dis; 8972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 8982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 8992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm( enum x86_options options, DISASM_REPORTER reporter ) { 9002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm * dis = (X86_Disasm *) 9012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof( X86_Disasm ), 1 ); 9022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_init( options, reporter, NULL ); 9032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return dis; 9042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm( enum x86_options options, DISASM_REPORTER reporter, 9072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * arg ) { 9082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_Disasm * dis = (X86_Disasm *) 9092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof( X86_Disasm ), 1 ); 9102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_init( options, reporter, arg ); 9112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return dis; 9122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ~X86_Disasm() { 9152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_cleanup(); 9162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( self ); 9172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void set_options( enum x86_options options ) { 9202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_set_options( options ); 9212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_options options() { 9242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_get_options(); 9252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void set_callback( void * callback ) { 9282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->disasm_callback = callback; 9292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void set_resolver( void * callback ) { 9322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org self->disasm_resolver = callback; 9332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void report_error( enum x86_report_codes code ) { 9362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_report_error( code, NULL ); 9372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject disasm; 9402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * disasm( unsigned char *buf, size_t buf_len, 9412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset ) { 9422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); 9432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_disasm( buf, buf_len, buf_rva, offset, insn ); 9442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return insn; 9452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int disasm_range( unsigned char *buf, size_t buf_len, 9482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset, 9492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int len ) { 9502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnList *list = new_X86_InsnList(); 9522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( len > buf_len ) { 9542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = buf_len; 9552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_disasm_range( buf, buf_rva, offset, len, 9582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_default_callback, list ); 9592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int disasm_forward( unsigned char *buf, size_t buf_len, 9622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset ) { 9632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org X86_InsnList *list = new_X86_InsnList(); 9642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* use default resolver: damn SWIG callbacks! */ 9662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_disasm_forward( buf, buf_len, buf_rva, offset, 9672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_default_callback, list, 9682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_default_resolver, NULL ); 9692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t disasm_invariant( unsigned char *buf, size_t buf_len, 9722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_invariant_t *inv ) { 9732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_invariant_disasm( buf, buf_len, inv ); 9742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t disasm_size( unsigned char *buf, size_t buf_len ) { 9772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_size_disasm( buf, buf_len ); 9782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 9792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject format_header; 9812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char * format_header( enum x86_asm_format format) { 9822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org char *buf, *str; 9832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t len; 9842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 9852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 9862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* these were obtained from x86_format.c */ 9872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 9882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = 679; break; 9892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 9902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = 172; break; 9912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 9922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = 35; break; 9932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 9942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = 23; break; 9952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 9962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = 23; break; 9972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 9982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 9992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = 23; break; 10002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org buf = (char * ) calloc( len + 1, 1 ); 10032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_format_header( buf, len, format ); 10042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return buf; 10062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int endian() { 10092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_endian(); 10102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int addr_size() { 10132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_addr_size(); 10142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int op_size() { 10172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_op_size(); 10182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int word_size() { 10212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_word_size(); 10222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int max_insn_size() { 10252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_max_insn_size(); 10262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int sp_reg() { 10292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_sp_reg(); 10302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int fp_reg() { 10332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_fp_reg(); 10342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int ip_reg() { 10372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_ip_reg(); 10382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org %newobject reg_from_id; 10412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_t * reg_from_id( unsigned int id ) { 10422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_t * reg = calloc( sizeof(x86_reg_t), 1 ); 10432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_reg_from_id( id, reg ); 10442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return reg; 10452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned char wildcard_byte() { return X86_WILDCARD_BYTE; } 10482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int max_register_string() { return MAX_REGNAME; } 10502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int max_prefix_string() { return MAX_PREFIX_STR; } 10522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int max_mnemonic_string() { return MAX_MNEM_STR; } 10542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int max_operand_string( enum x86_asm_format format ) { 10562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 10572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 10582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_OP_XML_STRING; 10592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 10602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 10612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_OP_RAW_STRING; 10622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 10632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 10642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 10652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 10662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 10672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 10682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_OP_STRING; 10692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 10702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int max_insn_string( enum x86_asm_format format ) { 10752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 10762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 10772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_INSN_XML_STRING; 10782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 10792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 10802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_INSN_RAW_STRING; 10812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 10822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 10832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 10842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 10852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 10862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 10872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_INSN_STRING; 10882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 10892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 10912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int max_num_operands( ) { return MAX_NUM_OPERANDS; } 10932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org} 10942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 10952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* python callback, per the manual */ 10962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/*%typemap(python,in) PyObject *pyfunc { 10972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (!PyCallable_Check($source)) { 10982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org PyErr_SetString(PyExc_TypeError, "Need a callable object!"); 10992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 11002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 11012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org $target = $source; 11022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}*/ 11032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 11042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* python FILE * callback, per the manual */ 11052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org/* 11062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%typemap(python,in) FILE * { 11072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (!PyFile_Check($source)) { 11082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org PyErr_SetString(PyExc_TypeError, "Need a file!"); 11092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 11102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 11112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org $target = PyFile_AsFile($source); 11122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}*/ 11132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 11142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1115