diff --git a/src/arm/midr.c b/src/arm/midr.c index 62a0300..c5531df 100644 --- a/src/arm/midr.c +++ b/src/arm/midr.c @@ -40,12 +40,14 @@ struct cache* get_cache_info(struct cpuInfo* cpu) { struct frequency* get_frequency_info(uint32_t core) { struct frequency* freq = emalloc(sizeof(struct frequency)); + freq->measured = false; freq->base = UNKNOWN_DATA; freq->max = get_max_freq_from_file(core); #ifdef __linux__ if (freq->max == UNKNOWN_DATA) { printWarn("Unable to find max frequency from udev, measuring CPU frequency"); freq->max = measure_max_frequency(core); + freq->measured = true; } #endif diff --git a/src/common/cpu.c b/src/common/cpu.c index a7d53ca..946c990 100644 --- a/src/common/cpu.c +++ b/src/common/cpu.c @@ -145,17 +145,25 @@ char* get_str_l3(struct cache* cach) { char* get_str_freq(struct frequency* freq) { //Max 3 digits and 3 for '(M/G)Hz' plus 1 for '\0' - uint32_t size = (5+1+3+1); + uint32_t size = (1+5+1+3+1); assert(strlen(STRING_UNKNOWN)+1 <= size); - char* string = emalloc(sizeof(char)*size); - memset(string, 0, sizeof(char)*size); + char* string = ecalloc(size, sizeof(char)); - if(freq->max == UNKNOWN_DATA || freq->max < 0) + if(freq->max == UNKNOWN_DATA || freq->max < 0) { snprintf(string,strlen(STRING_UNKNOWN)+1,STRING_UNKNOWN); - else if(freq->max >= 1000) - snprintf(string,size,"%.3f "STRING_GIGAHERZ,(float)(freq->max)/1000); - else - snprintf(string,size,"%d "STRING_MEGAHERZ,freq->max); + } + else if(freq->max >= 1000) { + if (freq->measured) + snprintf(string,size,"~%.3f "STRING_GIGAHERZ,(float)(freq->max)/1000); + else + snprintf(string,size,"%.3f "STRING_GIGAHERZ,(float)(freq->max)/1000); + } + else { + if (freq->measured) + snprintf(string,size,"~%d "STRING_MEGAHERZ,freq->max); + else + snprintf(string,size,"%d "STRING_MEGAHERZ,freq->max); + } return string; } diff --git a/src/common/cpu.h b/src/common/cpu.h index da023e0..fbe0848 100644 --- a/src/common/cpu.h +++ b/src/common/cpu.h @@ -57,6 +57,8 @@ typedef int32_t VENDOR; struct frequency { int32_t base; int32_t max; + // Indicates if max frequency was measured + bool measured; }; struct hypervisor { diff --git a/src/ppc/ppc.c b/src/ppc/ppc.c index 90ae308..4758d27 100644 --- a/src/ppc/ppc.c +++ b/src/ppc/ppc.c @@ -146,6 +146,7 @@ struct uarch* get_cpu_uarch(struct cpuInfo* cpu) { struct frequency* get_frequency_info(void) { struct frequency* freq = emalloc(sizeof(struct frequency)); + freq->measured = false; freq->max = get_max_freq_from_file(0); freq->base = get_min_freq_from_file(0); diff --git a/src/riscv/riscv.c b/src/riscv/riscv.c index c9e1b1f..b378f30 100644 --- a/src/riscv/riscv.c +++ b/src/riscv/riscv.c @@ -19,6 +19,7 @@ struct frequency* get_frequency_info(uint32_t core) { struct frequency* freq = emalloc(sizeof(struct frequency)); + freq->measured = false; freq->base = UNKNOWN_DATA; freq->max = get_max_freq_from_file(core); diff --git a/src/x86/cpuid.c b/src/x86/cpuid.c index 48f10f8..84821d6 100644 --- a/src/x86/cpuid.c +++ b/src/x86/cpuid.c @@ -923,6 +923,7 @@ struct cache* get_cache_info(struct cpuInfo* cpu) { struct frequency* get_frequency_info(struct cpuInfo* cpu) { struct frequency* freq = emalloc(sizeof(struct frequency)); + freq->measured = false; if(cpu->maxLevels < 0x00000016) { #if defined (_WIN32) || defined (__APPLE__) @@ -976,6 +977,7 @@ struct frequency* get_frequency_info(struct cpuInfo* cpu) { printWarn("All previous methods failed, measuring CPU frequency"); // TODO: Support hybrid architectures freq->max = measure_max_frequency(0); + freq->measured = true; } #endif