2 * $Id: x86dasm.c,v 1.3 2007-09-12 09:16:47 nkeynes Exp $
4 * Wrapper around i386-dis to supply the same behaviour as the other
5 * disassembly functions.
7 * Copyright (c) 2005 Nathan Keynes.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
24 #include "sh4/sh4core.h"
26 extern const struct reg_desc_struct sh4_reg_map[];
27 const struct cpu_desc_struct x86_cpu_desc =
28 { "x86", x86_disasm_instruction, NULL, mem_has_page,
30 (char *)&sh4r, sizeof(sh4r), sh4_reg_map,
33 static int x86_disasm_output( void *data, const char *format, ... );
34 static int x86_read_memory( bfd_vma memaddr, bfd_byte *buffer, unsigned int length,
35 struct disassemble_info *info );
36 static int x86_print_address( bfd_vma memaddr, struct disassemble_info *info );
38 static struct disassemble_info x86_disasm_info;
40 static x86_symbol *x86_symtab;
41 static int x86_num_symbols = 0;
43 void x86_disasm_block(FILE *out, void *start, uint32_t len)
45 uint32_t start_addr = (uint32_t)start;
47 x86_disasm_init( start, start_addr, len );
48 for( pc = start_addr; pc < start_addr + len; ) {
51 uint32_t pc2 = x86_disasm_instruction( pc, buf, sizeof(buf), op );
52 fprintf( out, "%08X: %-20s %s\n", pc, op, buf );
57 void x86_disasm_init(char *buf, uint32_t vma, int buflen)
59 init_disassemble_info( &x86_disasm_info, NULL, x86_disasm_output );
60 x86_disasm_info.arch = bfd_arch_i386;
61 x86_disasm_info.mach = bfd_mach_i386_i386_intel_syntax;
62 x86_disasm_info.endian = BFD_ENDIAN_LITTLE;
63 x86_disasm_info.buffer = buf;
64 x86_disasm_info.buffer_vma = vma;
65 x86_disasm_info.buffer_length = buflen;
66 x86_disasm_info.print_address_func = x86_print_address;
69 void x86_set_symtab( x86_symbol *symtab, int num_symbols )
72 x86_num_symbols = num_symbols;
75 static const char *x86_find_symbol( bfd_vma memaddr, struct disassemble_info *info )
78 for( i=0; i<x86_num_symbols; i++ ) {
79 if( x86_symtab[i].ptr == (void *)memaddr ) {
80 return x86_symtab[i].name;
86 static int x86_print_address( bfd_vma memaddr, struct disassemble_info *info )
88 const char *sym = x86_find_symbol(memaddr, info);
89 info->fprintf_func( info->stream, "%08X", memaddr );
91 info->fprintf_func( info->stream, " <%s>", sym );
96 uint32_t x86_disasm_instruction( uint32_t pc, char *buf, int len, char *opcode )
100 x86_disasm_info.stream = buf;
102 count = print_insn_i386_att( pc, &x86_disasm_info );
105 x86_disasm_info.read_memory_func( pc, tmp, count, &x86_disasm_info );
106 for( i=0; i<count; i++ ) {
107 sprintf( opcode, "%02X ", ((unsigned int)tmp[i])&0xFF );
115 int x86_disasm_output( void *data, const char *format, ... )
117 char *p = (char *)data;
121 va_start( ap, format );
122 n = vsprintf( p, format, ap );
.