Home | History | Annotate | Download | only in libdisasm
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 
      5 #include "libdis.h"
      6 #include "ia32_insn.h"
      7 #include "ia32_reg.h"		/* for ia32_reg wrapper */
      8 #include "ia32_settings.h"
      9 extern ia32_settings_t ia32_settings;
     10 
     11 #ifdef _MSC_VER
     12         #define snprintf        _snprintf
     13         #define inline          __inline
     14 #endif
     15 
     16 
     17 /* =========================================================== INIT/TERM */
     18 static DISASM_REPORTER __x86_reporter_func = NULL;
     19 static void * __x86_reporter_arg = NULL;
     20 
     21 int x86_init( enum x86_options options, DISASM_REPORTER reporter, void * arg )
     22 {
     23         ia32_settings.options = options;
     24         __x86_reporter_func = reporter;
     25 	__x86_reporter_arg = arg;
     26 
     27         return 1;
     28 }
     29 
     30 void x86_set_reporter( DISASM_REPORTER reporter, void * arg ) {
     31         __x86_reporter_func = reporter;
     32 	__x86_reporter_arg = arg;
     33 }
     34 
     35 void x86_set_options( enum x86_options options ){
     36         ia32_settings.options = options;
     37 }
     38 
     39 enum x86_options x86_get_options( void ) {
     40         return ia32_settings.options;
     41 }
     42 
     43 int x86_cleanup( void )
     44 {
     45         return 1;
     46 }
     47 
     48 /* =========================================================== ERRORS */
     49 void x86_report_error( enum x86_report_codes code, void *data ) {
     50         if ( __x86_reporter_func ) {
     51                 (*__x86_reporter_func)(code, data, __x86_reporter_arg);
     52         }
     53 }
     54 
     55 
     56 /* =========================================================== MISC */
     57 unsigned int x86_endian(void)        { return ia32_settings.endian;  }
     58 unsigned int x86_addr_size(void)     { return ia32_settings.sz_addr; }
     59 unsigned int x86_op_size(void)       { return ia32_settings.sz_oper; }
     60 unsigned int x86_word_size(void)     { return ia32_settings.sz_word; }
     61 unsigned int x86_max_insn_size(void) { return ia32_settings.max_insn; }
     62 unsigned int x86_sp_reg(void)        { return ia32_settings.id_sp_reg;      }
     63 unsigned int x86_fp_reg(void)        { return ia32_settings.id_fp_reg;      }
     64 unsigned int x86_ip_reg(void)        { return ia32_settings.id_ip_reg;      }
     65 unsigned int x86_flag_reg(void)        { return ia32_settings.id_flag_reg;  }
     66 
     67 /* wrapper function to hide the IA32 register fn */
     68 void x86_reg_from_id( unsigned int id, x86_reg_t * reg ) {
     69 	ia32_handle_register( reg, id );
     70 	return;
     71 }
     72