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 {