From 262049dee2cc639a802f255ceeb34f7528dea5b2 Mon Sep 17 00:00:00 2001 From: Dr-Noob Date: Sun, 18 Feb 2024 18:22:35 +0000 Subject: [PATCH] [v1.05][X86] Fix bug where the number of cpus were not set if NULL was returned inside the loop. Ensure topo is not NULL in get_peak_performance. Fallback to UNKNOWN_DATA when we have no information about topology --- src/x86/cpuid.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/src/x86/cpuid.c b/src/x86/cpuid.c index 1b00207..3507114 100644 --- a/src/x86/cpuid.c +++ b/src/x86/cpuid.c @@ -220,7 +220,7 @@ int64_t get_peak_performance(struct cpuInfo* cpu, bool accurate_pp) { #endif //First, check we have consistent data - if(freq == UNKNOWN_DATA || topo->logical_cores == UNKNOWN_DATA) { + if(freq == UNKNOWN_DATA || topo == NULL || topo->logical_cores == UNKNOWN_DATA) { return -1; } @@ -453,7 +453,7 @@ struct cpuInfo* get_cpu_info(void) { cpu->cach = NULL; cpu->feat = NULL; - uint32_t modules = 1; + cpu->num_cpus = 1; uint32_t eax = 0; uint32_t ebx = 0; uint32_t ecx = 0; @@ -509,12 +509,12 @@ struct cpuInfo* get_cpu_info(void) { cpu->hybrid_flag = (edx >> 15) & 0x1; } - if(cpu->hybrid_flag) modules = 2; + if(cpu->hybrid_flag) cpu->num_cpus = 2; struct cpuInfo* ptr = cpu; - for(uint32_t i=0; i < modules; i++) { + for(uint32_t i=0; i < cpu->num_cpus; i++) { int32_t first_core; - set_cpu_module(i, modules, &first_core); + set_cpu_module(i, cpu->num_cpus, &first_core); if(i > 0) { ptr->next_cpu = emalloc(sizeof(struct cpuInfo)); @@ -549,11 +549,11 @@ struct cpuInfo* get_cpu_info(void) { cpu->cpu_name = infer_cpu_name_from_uarch(cpu->arch); } - // If any field of the struct is NULL, - // return early, as next functions - // require non NULL fields in cach and topo + // If cach is NULL continue, + // as get_topology_info + // requires non-NULL cache ptr->cach = get_cache_info(ptr); - if(ptr->cach == NULL) return cpu; + if(ptr->cach == NULL) continue; if(cpu->hybrid_flag) { ptr->topo = get_topology_info(ptr, ptr->cach, i); @@ -561,10 +561,12 @@ struct cpuInfo* get_cpu_info(void) { else { ptr->topo = get_topology_info(ptr, ptr->cach, -1); } - if(cpu->topo == NULL) return cpu; + + // If topo is NULL, return early, as get_peak_performance + // requries non-NULL topology. + if(ptr->topo == NULL) return cpu; } - cpu->num_cpus = modules; cpu->peak_performance = get_peak_performance(cpu, accurate_pp()); return cpu; @@ -646,10 +648,12 @@ bool get_cache_topology_amd(struct cpuInfo* cpu, struct topology* topo) { #ifdef __linux__ void get_topology_from_udev(struct topology* topo) { - // TODO: To be improved in the future topo->total_cores = get_ncores_from_cpuinfo(); - topo->logical_cores = topo->total_cores; - topo->physical_cores = topo->total_cores; + // TODO: To be improved in the future + // Conservative setting as we only know the total + // number of cores. + topo->logical_cores = UNKNOWN_DATA; + topo->physical_cores = UNKNOWN_DATA; topo->smt_available = 1; topo->smt_supported = 1; topo->sockets = 1; @@ -713,8 +717,8 @@ struct topology* get_topology_info(struct cpuInfo* cpu, struct cache* cach, int } else { printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x00000001, cpu->maxLevels); - topo->physical_cores = 1; - topo->logical_cores = 1; + topo->physical_cores = UNKNOWN_DATA; + topo->logical_cores = UNKNOWN_DATA; topo->smt_available = 1; topo->smt_supported = 1; }