Beispiel #1
0
void X86CpuCreate(X86Cpu *self, X86Emu *emu) {
  X86Core *core;
  X86Thread *thread;

  char name[MAX_STRING_SIZE];

  int i;
  int j;

  /* Parent */
  TimingCreate(asTiming(self));

  /* Frequency */
  asTiming(self)->frequency = x86_cpu_frequency;
  asTiming(self)->frequency_domain = esim_new_domain(x86_cpu_frequency);

  /* Initialize */
  self->emu = emu;
  self->uop_trace_list = linked_list_create();

  /* Create cores */
  self->cores = xcalloc(x86_cpu_num_cores, sizeof(X86Core *));
  for (i = 0; i < x86_cpu_num_cores; i++) self->cores[i] = new (X86Core, self);

  /* Assign names and IDs to cores and threads */
  for (i = 0; i < x86_cpu_num_cores; i++) {
    core = self->cores[i];
    snprintf(name, sizeof name, "c%d", i);
    X86CoreSetName(core, name);
    core->id = i;
    for (j = 0; j < x86_cpu_num_threads; j++) {
      thread = core->threads[j];
      snprintf(name, sizeof name, "c%dt%d", i, j);
      X86ThreadSetName(thread, name);
      thread->id_in_core = j;
      thread->id_in_cpu = i * x86_cpu_num_threads + j;
    }
  }

  /* Virtual functions */
  asObject(self)->Dump = X86CpuDump;
  asTiming(self)->DumpSummary = X86CpuDumpSummary;
  asTiming(self)->Run = X86CpuRun;
  asTiming(self)->MemConfigCheck = X86CpuMemConfigCheck;
  asTiming(self)->MemConfigDefault = X86CpuMemConfigDefault;
  asTiming(self)->MemConfigParseEntry = X86CpuMemConfigParseEntry;

  /* Trace */
  x86_trace_header("x86.init version=\"%d.%d\" num_cores=%d num_threads=%d\n",
                   X86_TRACE_VERSION_MAJOR, X86_TRACE_VERSION_MINOR,
                   x86_cpu_num_cores, x86_cpu_num_threads);
}
Beispiel #2
0
/* Initialization */
void x86_cpu_init()
{
	int core;

	/* Trace */
	x86_trace_category = trace_new_category();

	/* Register architecture */
	x86_emu_arch->mem_config_check_func = x86_mem_config_check;
	x86_emu_arch->mem_config_default_func = x86_mem_config_default;
	x86_emu_arch->mem_config_parse_entry_func = x86_mem_config_parse_entry;

	/* Analyze CPU configuration file */
	x86_cpu_config_check();

	/* Initialize */
	x86_cpu = xcalloc(1, sizeof(struct x86_cpu_t));
	x86_cpu->uop_trace_list = linked_list_create();

	/* Initialize cores */
	x86_cpu->core = xcalloc(x86_cpu_num_cores, sizeof(struct x86_core_t));
	X86_CORE_FOR_EACH
		x86_cpu_core_init(core);

	/* Components of an x86 CPU */
	x86_reg_file_init();
	x86_bpred_init();
	x86_trace_cache_init();
	x86_fetch_queue_init();
	x86_uop_queue_init();
	x86_rob_init();
	x86_iq_init();
	x86_lsq_init();
	x86_event_queue_init();
	x86_fu_init();

	/* Trace */
	x86_trace_header("x86.init version=\"%d.%d\" num_cores=%d num_threads=%d\n",
		X86_TRACE_VERSION_MAJOR, X86_TRACE_VERSION_MINOR,
		x86_cpu_num_cores, x86_cpu_num_threads);
}