initial APIC support (only for x86_64 target now)
[qemu] / disas.c
diff --git a/disas.c b/disas.c
index e315299..bfab8c3 100644 (file)
--- a/disas.c
+++ b/disas.c
@@ -9,9 +9,7 @@
 #include "disas.h"
 
 /* Filled in by elfload.c.  Simplistic, but will do for now. */
-unsigned int disas_num_syms;
-void *disas_symtab;
-const char *disas_strtab;
+struct syminfo *syminfos = NULL;
 
 /* Get LENGTH bytes from info's buffer, at target address memaddr.
    Transfer them to myaddr.  */
@@ -203,25 +201,32 @@ const char *lookup_symbol(void *orig_addr)
 {
     unsigned int i;
     /* Hack, because we know this is x86. */
-    Elf32_Sym *sym = disas_symtab;
-
-    for (i = 0; i < disas_num_syms; i++) {
-       if (sym[i].st_shndx == SHN_UNDEF
-           || sym[i].st_shndx >= SHN_LORESERVE)
-           continue;
-
-       if (ELF_ST_TYPE(sym[i].st_info) != STT_FUNC)
-           continue;
-
-       if ((long)orig_addr >= sym[i].st_value
-           && (long)orig_addr < sym[i].st_value + sym[i].st_size)
-           return disas_strtab + sym[i].st_name;
+    Elf32_Sym *sym;
+    struct syminfo *s;
+    
+    for (s = syminfos; s; s = s->next) {
+       sym = s->disas_symtab;
+       for (i = 0; i < s->disas_num_syms; i++) {
+           if (sym[i].st_shndx == SHN_UNDEF
+               || sym[i].st_shndx >= SHN_LORESERVE)
+               continue;
+
+           if (ELF_ST_TYPE(sym[i].st_info) != STT_FUNC)
+               continue;
+
+           if ((long)orig_addr >= sym[i].st_value
+               && (long)orig_addr < sym[i].st_value + sym[i].st_size)
+               return s->disas_strtab + sym[i].st_name;
+       }
     }
     return "";
 }
 
 #if !defined(CONFIG_USER_ONLY)
 
+void term_vprintf(const char *fmt, va_list ap);
+void term_printf(const char *fmt, ...);
+
 static int monitor_disas_is_physical;
 
 static int
@@ -239,16 +244,22 @@ monitor_read_memory (memaddr, myaddr, length, info)
     return 0;
 }
 
+static int monitor_fprintf(FILE *stream, const char *fmt, ...)
+{
+    va_list ap;
+    va_start(ap, fmt);
+    term_vprintf(fmt, ap);
+    va_end(ap);
+    return 0;
+}
+
 void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags)
 {
-    FILE *out;
     int count, i;
     struct disassemble_info disasm_info;
     int (*print_insn)(bfd_vma pc, disassemble_info *info);
 
-    out = stdout;
-
-    INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf);
+    INIT_DISASSEMBLE_INFO(disasm_info, NULL, monitor_fprintf);
 
     monitor_disas_is_physical = is_physical;
     disasm_info.read_memory_func = monitor_read_memory;
@@ -273,14 +284,14 @@ void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags)
 #elif defined(TARGET_PPC)
     print_insn = print_insn_ppc;
 #else
-    fprintf(out, "Asm output not supported on this arch\n");
+    term_printf("Asm output not supported on this arch\n");
     return;
 #endif
 
     for(i = 0; i < nb_insn; i++) {
-       fprintf(out, "0x%08lx:  ", (unsigned long)pc);
+       term_printf("0x%08lx:  ", (unsigned long)pc);
        count = print_insn(pc, &disasm_info);
-       fprintf(out, "\n");
+       term_printf("\n");
        if (count < 0)
            break;
         pc += count;