Пример #1
0
/* 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;
}
Пример #2
0
/* 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;
}