/* Run one iteration of the x86 emulation loop. * Return FALSE if there is no more simulation to perform. */ int x86_emu_run(void) { struct x86_ctx_t *ctx; /* Stop if there is no context running */ if (x86_emu->finished_list_count >= x86_emu->context_list_count) return 0; /* Stop if maximum number of CPU instructions exceeded */ if (x86_emu_max_inst && x86_emu->inst_count >= x86_emu_max_inst) esim_finish = esim_finish_x86_max_inst; /* Stop if maximum number of cycles exceeded */ if (x86_emu_max_cycles && esim_cycle >= x86_emu_max_cycles) esim_finish = esim_finish_x86_max_cycles; /* Stop if any previous reason met */ if (esim_finish) return 0; /* Run an instruction from every running process */ for (ctx = x86_emu->running_list_head; ctx; ctx = ctx->running_list_next) x86_ctx_execute(ctx); /* Free finished contexts */ while (x86_emu->finished_list_head) x86_ctx_free(x86_emu->finished_list_head); /* Process list of suspended contexts */ x86_emu_process_events(); /* Return TRUE */ return 1; }
/* Run one iteration of the x86 timing simulation loop. * The function returns FALSE if there is no more simulation to perform. */ int x86_cpu_run(void) { /* Stop if no context is running */ if (x86_emu->finished_list_count >= x86_emu->context_list_count) return 0; /* Fast-forward simulation */ if (x86_cpu_fast_forward_count && x86_emu->inst_count < x86_cpu_fast_forward_count) x86_cpu_run_fast_forward(); /* Stop if maximum number of CPU instructions exceeded */ if (x86_emu_max_inst && x86_cpu->num_committed_inst >= (x86_emu_max_inst - x86_cpu->num_fast_forward_inst)) esim_finish = esim_finish_x86_max_inst; /* Stop if maximum number of cycles exceeded */ if (x86_emu_max_cycles && x86_cpu->cycle >= x86_emu_max_cycles) esim_finish = esim_finish_x86_max_cycles; /* Stop if any previous reason met */ if (esim_finish) return 0; /* One more cycle of x86 timing simulation */ x86_cpu->cycle++; /* Empty uop trace list. This dumps the last trace line for instructions * that were freed in the previous simulation cycle. */ x86_cpu_uop_trace_list_empty(); /* Processor stages */ x86_cpu_run_stages(); /* Process host threads generating events */ x86_emu_process_events(); /* Return TRUE */ return 1; }