void x86_cpu_dump(FILE *f) { int core; int thread; /* General information */ fprintf(f, "\n"); fprintf(f, "sim.last_dump %lld # Cycle of last dump\n", x86_cpu->last_dump); fprintf(f, "sim.ipc_last_dump %.4g # IPC since last dump\n", x86_cpu->cycle - x86_cpu->last_dump > 0 ? (double) (x86_cpu->num_committed_uinst - x86_cpu->last_committed) / (x86_cpu->cycle - x86_cpu->last_dump) : 0); fprintf(f, "\n"); /* Cores */ X86_CORE_FOR_EACH { fprintf(f, "Core %d:\n", core); fprintf(f, "eventq:\n"); x86_uop_linked_list_dump(X86_CORE.event_queue, f); fprintf(f, "rob:\n"); x86_rob_dump(core, f); X86_THREAD_FOR_EACH { fprintf(f, "Thread %d:\n", thread); fprintf(f, "fetch queue:\n"); x86_uop_list_dump(X86_THREAD.fetch_queue, f); fprintf(f, "uop queue:\n"); x86_uop_list_dump(X86_THREAD.uop_queue, f); fprintf(f, "iq:\n"); x86_uop_linked_list_dump(X86_THREAD.iq, f); fprintf(f, "lq:\n"); x86_uop_linked_list_dump(X86_THREAD.lq, f); fprintf(f, "sq:\n"); x86_uop_linked_list_dump(X86_THREAD.sq, f); x86_reg_file_dump(core, thread, f); if (X86_THREAD.ctx) { fprintf(f, "mapped context: %d\n", X86_THREAD.ctx->pid); x86_ctx_dump(X86_THREAD.ctx, f); } fprintf(f, "\n"); } } /* Register last dump */ x86_cpu->last_dump = x86_cpu->cycle; x86_cpu->last_committed = x86_cpu->num_committed_uinst; }
void X86CpuDump(Object *self, FILE *f) { X86Cpu *cpu = asX86Cpu(self); X86Core *core; X86Thread *thread; int i; int j; /* General information */ fprintf(f, "\n"); fprintf(f, "LastDump = %lld ; Cycle of last dump\n", cpu->last_dump); fprintf(f, "IPCLastDump = %.4g ; IPC since last dump\n", asTiming(cpu)->cycle - cpu->last_dump > 0 ? (double)(cpu->num_committed_uinst - cpu->last_committed) / (asTiming(cpu)->cycle - cpu->last_dump) : 0); fprintf(f, "\n"); /* Cores */ for (i = 0; i < x86_cpu_num_cores; i++) { core = cpu->cores[i]; fprintf(f, "-------\n"); fprintf(f, "Core %d\n", core->id); fprintf(f, "-------\n\n"); fprintf(f, "Event Queue:\n"); x86_uop_linked_list_dump(core->event_queue, f); fprintf(f, "Reorder Buffer:\n"); X86CoreDumpROB(core, f); for (j = 0; j < x86_cpu_num_threads; j++) { thread = core->threads[j]; fprintf(f, "----------------------\n"); fprintf(f, "Thread %d (in core %d)\n", j, i); fprintf(f, "----------------------\n\n"); fprintf(f, "Fetch queue:\n"); x86_uop_list_dump(thread->fetch_queue, f); fprintf(f, "Uop queue:\n"); x86_uop_list_dump(thread->uop_queue, f); fprintf(f, "Instruction Queue:\n"); x86_uop_linked_list_dump(thread->iq, f); fprintf(f, "Load Queue:\n"); x86_uop_linked_list_dump(thread->lq, f); fprintf(f, "Store Queue:\n"); x86_uop_linked_list_dump(thread->sq, f); X86ThreadDumpRegFile(thread, f); if (thread->ctx) fprintf(f, "MappedContext = %d\n", thread->ctx->pid); fprintf(f, "\n"); } } /* Register last dump */ cpu->last_dump = asTiming(cpu)->cycle; cpu->last_committed = cpu->num_committed_uinst; /* End */ fprintf(f, "\n\n"); }