From fcb2c716db821872339159a6e0949ef811c8aa43 Mon Sep 17 00:00:00 2001 From: Dr-Noob Date: Sun, 22 Nov 2020 10:23:02 +0100 Subject: [PATCH] [v0.87][FREQ] Frequency in udev is now fetched as a per core basis. Before this commit, freq was always fetched from core 0. This allows ARM do detect the max frequency of each of the cores (which may or may not be the same in all of them) --- src/arm/midr.c | 11 +++++------ src/arm/midr.h | 2 +- src/common/udev.c | 27 +++++++++++++++------------ src/common/udev.h | 4 ++-- src/x86/cpuid.c | 2 +- 5 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/arm/midr.c b/src/arm/midr.c index 99382e2..0ded9d5 100644 --- a/src/arm/midr.c +++ b/src/arm/midr.c @@ -52,11 +52,11 @@ struct cache* get_cache_info(struct cpuInfo* cpu) { return cach; } -struct frequency* get_frequency_info(struct cpuInfo* cpu) { +struct frequency* get_frequency_info(uint32_t core) { struct frequency* freq = malloc(sizeof(struct frequency)); freq->base = UNKNOWN_FREQ; - freq->max = get_max_freq_from_file(); + freq->max = get_max_freq_from_file(core); return freq; } @@ -151,7 +151,7 @@ struct cpuInfo* get_cpu_info() { ptr->midr = midr_array[midr_idx]; ptr->arch = get_uarch_from_midr(ptr->midr, ptr); - ptr->freq = get_frequency_info(ptr); + ptr->freq = get_frequency_info(i); // TODO: wrong! ptr->cach = get_cache_info(ptr); ptr->topo = get_topology_info(ptr, ptr->cach); } @@ -210,18 +210,17 @@ char* get_soc_name(struct cpuInfo* cpu) { return cpu->soc_name; } -//TODO: Fix wrong implementation void print_debug(struct cpuInfo* cpu) { int ncores = get_ncores_from_cpuinfo(); if(ncores >= 10) { for(int i=0; i < ncores; i++) { - printf("[Core %02d] 0x%.8X\n", i, cpu->midr); + printf("[Core %02d] 0x%.8X %ld MHz\n", i, get_midr_from_cpuinfo(i), get_max_freq_from_file(i)); } } else { for(int i=0; i < ncores; i++) { - printf("[Core %d] 0x%.8X\n", i, cpu->midr); + printf("[Core %d] 0x%.8X %ld MHz\n", i, get_midr_from_cpuinfo(i), get_max_freq_from_file(i)); } } } diff --git a/src/arm/midr.h b/src/arm/midr.h index 1084ef7..e64eb31 100644 --- a/src/arm/midr.h +++ b/src/arm/midr.h @@ -5,7 +5,7 @@ struct cpuInfo* get_cpu_info(); struct cache* get_cache_info(struct cpuInfo* cpu); -struct frequency* get_frequency_info(struct cpuInfo* cpu); +struct frequency* get_frequency_info(uint32_t core); struct topology* get_topology_info(struct cpuInfo* cpu, struct cache* cach); uint32_t get_nsockets(struct topology* topo); diff --git a/src/common/udev.c b/src/common/udev.c index 8193cf8..0566524 100644 --- a/src/common/udev.c +++ b/src/common/udev.c @@ -13,15 +13,14 @@ #include "../arm/midr.h" #endif -#define _PATH_SYS_SYSTEM "/sys/devices/system" -#define _PATH_SYS_CPU _PATH_SYS_SYSTEM"/cpu" -#define _PATH_ONE_CPU _PATH_SYS_CPU"/cpu0" +#define _PATH_SYS_SYSTEM "/sys/devices/system" +#define _PATH_SYS_CPU "/cpu" +#define _PATH_FREQUENCY "/cpufreq" +#define _PATH_FREQUENCY_MAX "/cpuinfo_max_freq" +#define _PATH_FREQUENCY_MIN "/cpuinfo_min_freq" -#define _PATH_FREQUENCY _PATH_ONE_CPU"/cpufreq" -#define _PATH_FREQUENCY_MAX _PATH_FREQUENCY"/cpuinfo_max_freq" -#define _PATH_FREQUENCY_MIN _PATH_FREQUENCY"/cpuinfo_min_freq" - -#define DEFAULT_FILE_SIZE 4096 +#define _PATH_FREQUENCY_MAX_LEN 100 +#define DEFAULT_FILE_SIZE 4096 long get_freq_from_file(char* path) { int fd = open(path, O_RDONLY); @@ -70,12 +69,16 @@ long get_freq_from_file(char* path) { return ret/1000; } -long get_max_freq_from_file() { - return get_freq_from_file(_PATH_FREQUENCY_MAX); +long get_max_freq_from_file(uint32_t core) { + char path[_PATH_FREQUENCY_MAX_LEN]; + sprintf(path, "%s%s/cpu%d%s%s", _PATH_SYS_SYSTEM, _PATH_SYS_CPU, core, _PATH_FREQUENCY, _PATH_FREQUENCY_MAX); + return get_freq_from_file(path); } -long get_min_freq_from_file() { - return get_freq_from_file(_PATH_FREQUENCY_MIN); +long get_min_freq_from_file(uint32_t core) { + char path[_PATH_FREQUENCY_MAX_LEN]; + sprintf(path, "%s%s/cpu%d%s%s", _PATH_SYS_SYSTEM, _PATH_SYS_CPU, core, _PATH_FREQUENCY, _PATH_FREQUENCY_MIN); + return get_freq_from_file(path); } #ifdef ARCH_ARM diff --git a/src/common/udev.h b/src/common/udev.h index 528995d..3161b1f 100644 --- a/src/common/udev.h +++ b/src/common/udev.h @@ -3,8 +3,8 @@ #include -long get_max_freq_from_file(); -long get_min_freq_from_file(); +long get_max_freq_from_file(uint32_t core); +long get_min_freq_from_file(uint32_t core); #ifdef ARCH_ARM int get_ncores_from_cpuinfo(); diff --git a/src/x86/cpuid.c b/src/x86/cpuid.c index 7f66b70..4106b79 100755 --- a/src/x86/cpuid.c +++ b/src/x86/cpuid.c @@ -678,7 +678,7 @@ struct frequency* get_frequency_info(struct cpuInfo* cpu) { #else printWarn("Can't read frequency information from cpuid (needed level is 0x%.8X, max is 0x%.8X). Using udev", 0x00000016, cpu->maxLevels); freq->base = UNKNOWN_FREQ; - freq->max = get_max_freq_from_file(); + freq->max = get_max_freq_from_file(0); #endif } else {