12b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%module x86disasm 22b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%{ 32b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "../../libdis.h" 42b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "../../../config.h" 52b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 62b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 72b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(version_string) x86_version_string; 82b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%include "../../libdis.h" 92b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org#include "../../../config.h" 102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org const char * x86_version_string( void ) { 132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return PACKAGE_VERSION; 142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(report_codes) x86_report_codes; 182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(report_error) x86_report_error; 192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(options) x86_options; 202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(init) x86_init; 212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(set_reporter) x86_set_reporter; 222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(set_options) x86_set_options; 232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(options) x86_get_options; 242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(cleanup) x86_cleanup; 252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg_type) x86_reg_type; 262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg) x86_reg_t; 272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(eaddr) x86_ea_t; 282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(op_type) x86_op_type; 292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(optype_is_address) x86_optype_is_address; 302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(optype_is_relative) x86_optype_is_relative; 312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(op_datatype) x86_op_datatype; 322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(op_access) x86_op_access; 332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(op_flags) x86_op_flags; 342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(operand) x86_op_t; 352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_group) x86_insn_group; 362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_type) x86_insn_type; 372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_note) x86_insn_note ; 382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(flag_status) x86_flag_status; 392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_cpu) x86_insn_cpu ; 402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_isa) x86_insn_isa ; 412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_prefix) x86_insn_prefix ; 422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn) x86_insn_t; 432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_is_valid) x86_insn_is_valid; 442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(i_disasm) x86_disasm; 452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(i_disasm_range) x86_disasm_range; 462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(i_disasm_forward) x86_disasm_forward; 472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_operand_count) x86_operand_count; 482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_operand_1st) x86_operand_1st; 492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_operand_2nd) x86_operand_2nd; 502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_operand_3rd) x86_operand_3rd; 512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_dest_operand) x86_get_dest_operand; 522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_src_operand) x86_get_src_operand; 532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_imm_operand) x86_get_imm_operand; 542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(operand_size) x86_operand_size; 552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_rel_offset) x86_get_rel_offset; 562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_branch_target) x86_get_branch_target; 572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_imm) x86_get_imm; 582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_raw_imm) x86_get_raw_imm; 592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_set_addr) x86_set_insn_addr; 602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_set_offset) x86_set_insn_offset; 612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_set_function) x86_set_insn_function; 622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_set_block) x86_set_insn_block; 632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_tag) x86_tag_insn; 642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_untag) x86_untag_insn; 652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_is_tagged) x86_insn_is_tagged; 662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(asm_format) x86_asm_format; 672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(operand_format) x86_format_operand; 682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_format_mnemonic) x86_format_mnemonic; 692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(insn_format) x86_format_insn; 702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(header_format) x86_format_header; 712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(endian) x86_endian; 722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(size_default_address) x86_addr_size; 732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(size_default_operand) x86_op_size; 742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(size_machine_word) x86_word_size; 752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(size_max_insn) x86_max_insn_size; 762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg_sp) x86_sp_reg; 772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg_fp) x86_fp_reg; 782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg_ip) x86_ip_reg; 792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg_from_id) x86_reg_from_id; 802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(reg_from_alias) x86_get_aliased_reg; 812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(invariant_op) x86_invariant_op_t; 822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(invariant) x86_invariant_t; 832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(disasm_invariant) x86_invariant_disasm; 842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%rename(disasm_size) x86_size_disasm; 852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%include "carrays.i" 872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%array_class( unsigned char, byteArray ); 892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%apply (unsigned char *STRING, int LENGTH) { 922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org (unsigned char *buf, size_t buf_len) 932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org}; 942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86_op_copy; 972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t * x86_op_copy( x86_op_t * src ) { 992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t *op; 1002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! src ) { 1022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 1032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); 1062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( op ) { 1072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org memcpy( op, src, sizeof(x86_op_t) ); 1082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return op; 1112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct x86_op_list_node { 1142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_t *op; 1152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org struct x86_op_list_node *next, *prev; 1162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_op_list_node; 1172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct x86_op_list { 1192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t count; 1202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node *head, *tail, *curr; 1212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_op_list; 1222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list * x86_op_list_new () { 1242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list *list = (x86_op_list *) 1252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_op_list), 1 ); 1262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->count = 0; 1272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list; 1282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_op_list_free(x86_op_list *list) { 1312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node *node, *next; 1322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = list->head; 1342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org while ( node ) { 1352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org next = node->next; 1362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* free( node->insn ); */ 1372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( node ); 1382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = next; 1392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( list ); 1422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node * x86_op_list_first(x86_op_list *list) { 1452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->head; 1462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node * x86_op_list_last(x86_op_list *list) { 1492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->tail; 1502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node * x86_op_list_next(x86_op_list *list) { 1532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list->curr ) { 1542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->head; 1552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->head; 1562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->curr->next; 1592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->curr; 1602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node * x86_op_list_prev(x86_op_list *list) { 1632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list->curr ) { 1642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->tail; 1652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->tail; 1662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->curr->prev; 1692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->curr; 1702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 1732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86_op_list_append; 1752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 1772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_op_list_append( x86_op_list * list, x86_op_t *op ) { 1782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_node *node = (x86_op_list_node *) 1792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_op_list_node) , 1 ); 1802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! node ) { 1812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return; 1822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->count++; 1852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( ! list->tail ) { 1862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->head = list->tail = node; 1872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } else { 1882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->tail->next = node; 1892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->prev = list->tail; 1902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->tail = node; 1912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->op = x86_op_copy( op ); 1942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 1952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 1962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t * x86_op_list_node_copy( x86_oplist_t * list ) { 1972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *ptr; 1982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); 1992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( ptr ) { 2002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); 2012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return ptr; 2042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * x86_insn_new() { 2072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn = (x86_insn_t *) 2082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_insn_t), 1 ); 2092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return insn; 2102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_insn_free( x86_insn_t *insn ) { 2132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_free( insn ); 2142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( insn ); 2152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 2172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86_insn_copy; 2192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 2212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * x86_insn_copy( x86_insn_t *src) { 2222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *ptr, *list, *last = NULL; 2232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn = (x86_insn_t *) 2242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_insn_t), 1 ); 2252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( insn ) { 2272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org memcpy( insn, src, sizeof(x86_insn_t) ); 2282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->operands = NULL; 2292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->block = NULL; 2302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->function = NULL; 2312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* copy operand list */ 2332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org for ( list = src->operands; list; list = list->next ) { 2342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org ptr = x86_op_list_node_copy( list ); 2352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! ptr ) { 2372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org continue; 2382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( insn->operands ) { 2412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org last->next = ptr; 2422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } else { 2432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org insn->operands = ptr; 2442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org last = ptr; 2462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return insn; 2502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list * x86_insn_op_list( x86_insn_t *insn ) { 2532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_oplist_t *list = insn->operands; 2542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list *op_list = x86_op_list_new(); 2552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org for ( list = insn->operands; list; list = list->next ) { 2572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_op_list_append( op_list, &list->op ); 2582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return op_list; 2612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct x86_insn_list_node { 2642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn; 2652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org struct x86_insn_list_node *next, *prev; 2662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_insn_list_node; 2672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct x86_insn_list { 2692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t count; 2702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node *head, *tail, *curr; 2712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86_insn_list; 2722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 2742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86_insn_list_new; 2762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 2782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list * x86_insn_list_new () { 2792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list *list = (x86_insn_list *) 2802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_insn_list), 1 ); 2812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->count = 0; 2822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list; 2832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_insn_list_free( x86_insn_list * list ) { 2862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node *node, *next; 2872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list ) { 2892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return; 2902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 2922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = list->head; 2932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org while ( node ) { 2942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org next = node->next; 2952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* free( node->insn ); */ 2962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( node ); 2972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = next; 2982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 2992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( list ); 3012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node * x86_insn_list_first( x86_insn_list *list ) { 3042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list ) { 3052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 3062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->head; 3082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node * x86_insn_list_last( x86_insn_list *list ) { 3112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list ) { 3122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 3132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->tail; 3152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node * x86_insn_list_next( x86_insn_list *list ) { 3182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list ) { 3192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 3202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list->curr ) { 3222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->head; 3232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->head; 3242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->curr->next; 3272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->curr; 3282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node * x86_insn_list_prev( x86_insn_list *list ) { 3312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list ) { 3322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return NULL; 3332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list->curr ) { 3352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->tail; 3362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->tail; 3372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->curr = list->curr->prev; 3402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return list->curr; 3412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 3442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86_insn_list_append; 3462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 3482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_insn_list_append( x86_insn_list *list, x86_insn_t *insn ) { 3492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_node *node; 3502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! list ) { 3512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return; 3522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node = (x86_insn_list_node *) 3552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof(x86_insn_list_node) , 1 ); 3562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if (! node ) { 3582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return; 3592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->count++; 3622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( ! list->tail ) { 3632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->head = list->tail = node; 3642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } else { 3652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->tail->next = node; 3662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->prev = list->tail; 3672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org list->tail = node; 3682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org node->insn = x86_insn_copy( insn ); 3712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org typedef struct { 3742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org enum x86_report_codes last_error; 3752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * last_error_data; 3762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * disasm_callback; 3772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void * disasm_resolver; 3782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } x86disasm; 3792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_default_reporter( enum x86_report_codes code, 3812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void *data, void *arg ) { 3822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86disasm *dis = (x86disasm *) arg; 3832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( dis ) { 3842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org dis->last_error = code; 3852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org dis->last_error_data = data; 3862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86_default_callback( x86_insn_t *insn, void *arg ) { 3902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list *list = (x86_insn_list *) arg; 3912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( list ) { 3922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list_append( list, insn ); 3932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 3952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 3962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* TODO: resolver stack, maybe a callback */ 3972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { 3982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86disasm *dis = (x86disasm *) arg; 3992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( dis ) { 4002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org //return dis->resolver( op, insn ); 4012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 0; 4022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return 0; 4052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 4092b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4102b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86disasm_new; 4112b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4122b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 4132b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86disasm * x86disasm_new ( enum x86_options options ) { 4142b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86disasm * dis = (x86disasm *) 4152b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org calloc( sizeof( x86disasm ), 1 ); 4162b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_init( options, x86_default_reporter, dis ); 4172b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return dis; 4182b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4192b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4202b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org void x86disasm_free( x86disasm * dis ) { 4212b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_cleanup(); 4222b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org free( dis ); 4232b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4242b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 4252b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4262b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%newobject x86_disasm; 4272b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4282b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%inline %{ 4292b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t * disasm( unsigned char *buf, size_t buf_len, 4302b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset ) { 4312b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); 4322b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_disasm( buf, buf_len, buf_rva, offset, insn ); 4332b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return insn; 4342b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4352b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4362b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int disasm_range( unsigned char *buf, size_t buf_len, 4372b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset, 4382b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned int len ) { 4392b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4402b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list *list = x86_insn_list_new(); 4412b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4422b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org if ( len > buf_len ) { 4432b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org len = buf_len; 4442b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4452b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4462b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_disasm_range( buf, buf_rva, offset, len, 4472b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_default_callback, list ); 4482b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4492b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4502b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int disasm_forward( unsigned char *buf, size_t buf_len, 4512b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org unsigned long buf_rva, unsigned int offset ) { 4522b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_insn_list *list = x86_insn_list_new(); 4532b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4542b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org /* use default resolver: damn SWIG callbacks! */ 4552b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_disasm_forward( buf, buf_len, buf_rva, offset, 4562b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_default_callback, list, 4572b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_default_resolver, NULL ); 4582b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4592b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4602b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t disasm_invariant( unsigned char *buf, size_t buf_len, 4612b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org x86_invariant_t *inv ) { 4622b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_invariant_disasm( buf, buf_len, inv ); 4632b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4642b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4652b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org size_t disasm_size( unsigned char *buf, size_t buf_len ) { 4662b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return x86_size_disasm( buf, buf_len ); 4672b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4682b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4692b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_max_operand_string( enum x86_asm_format format ) { 4702b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 4712b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 4722b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_OP_XML_STRING; 4732b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 4742b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 4752b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_OP_RAW_STRING; 4762b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 4772b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 4782b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 4792b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 4802b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 4812b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 4822b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_OP_STRING; 4832b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 4842b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4852b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 4862b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4872b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 4882b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_max_insn_string( enum x86_asm_format format ) { 4892b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org switch ( format ) { 4902b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case xml_syntax: 4912b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_INSN_XML_STRING; 4922b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 4932b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case raw_syntax: 4942b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_INSN_RAW_STRING; 4952b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 4962b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case native_syntax: 4972b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case intel_syntax: 4982b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case att_syntax: 4992b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org case unknown_syntax: 5002b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org default: 5012b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org return MAX_INSN_STRING; 5022b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org break; 5032b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5042b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org } 5052b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 5062b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org int x86_max_num_operands( ) { return MAX_NUM_OPERANDS; } 5072b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org%} 5082b4274afc4fae883d1251a7a420e24fd526a9f16cdn@chromium.org 509