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