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); }
/* 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); }