diff --git a/src/apic.c b/src/apic.c index 792095c..fb509ce 100644 --- a/src/apic.c +++ b/src/apic.c @@ -243,3 +243,19 @@ bool get_topology_from_apic(uint32_t cpuid_max_levels, struct topology** topo) { return ret; } + +// Used by AMD +uint32_t is_smt_enabled(struct topology* topo) { + uint32_t id; + + for(int i = 0; i < topo->total_cores; i++) { + if(!bind_to_cpu(i)) { + printErr("Failed binding to CPU %d", i); + return false; + } + id = get_apic_id(true) & 1; // get the last bit + if(id == 1) return 2; // We assume there isn't any AMD CPU with more than 2th per core + } + + return 1; +} diff --git a/src/apic.h b/src/apic.h index afbb0dd..5035667 100644 --- a/src/apic.h +++ b/src/apic.h @@ -13,5 +13,6 @@ struct apic { }; bool get_topology_from_apic(uint32_t cpuid_max_levels, struct topology** topo); +uint32_t is_smt_enabled(struct topology* topo); #endif diff --git a/src/args.c b/src/args.c index 6f99581..84aef17 100644 --- a/src/args.c +++ b/src/args.c @@ -173,7 +173,7 @@ bool parse_args(int argc, char* argv[]) { } args.style = parse_style(optarg); if(args.style == STYLE_INVALID) { - printErr("Invalid style '%s'\n",optarg); + printErr("Invalid style '%s'",optarg); return false; } } diff --git a/src/cpuid.c b/src/cpuid.c index 0f928f0..29c70b0 100644 --- a/src/cpuid.c +++ b/src/cpuid.c @@ -315,25 +315,29 @@ struct topology* get_topology_info(struct cpuInfo* cpu) { } else { printWarn("Can't read topology information from cpuid (needed extended level is 0x%.8X, max is 0x%.8X)", 0x8000001E, cpu->maxExtendedLevels); - topo->smt_supported = 1; - topo->smt_available = 1; - } - topo->physical_cores = topo->logical_cores / topo->smt_available; + topo->smt_supported = 1; + } } else { - printWarn("Can't read topology information from cpuid (needed extended level is 0x%.8X, max is 0x%.8X)", 0x80000008, cpu->maxExtendedLevels); + printErr("Can't read topology information from cpuid (needed extended level is 0x%.8X, max is 0x%.8X)", 0x80000008, cpu->maxExtendedLevels); topo->physical_cores = 1; topo->logical_cores = 1; - topo->smt_supported = 1; - topo->smt_available = 1; + topo->smt_supported = 1; } if (cpu->maxLevels >= 0x0000000B) { - //topo->smt_supported = is_smt_enabled(topo); + topo->smt_available = is_smt_enabled(topo); } else { - printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x80000008, cpu->maxLevels); - topo->smt_supported = 1; + printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x0000000B, cpu->maxLevels); + topo->smt_available = 1; } + topo->physical_cores = topo->logical_cores / topo->smt_available; + + if(topo->smt_supported > 1) + topo->sockets = topo->total_cores / topo->smt_supported / topo->physical_cores; // Idea borrowed from lscpu + else + topo->sockets = topo->total_cores / topo->physical_cores; + break; default: printBug("Cant get topology because VENDOR is empty"); @@ -760,7 +764,7 @@ char* get_str_cache_two(int32_t cache_size, uint32_t physical_cores) { printBug("get_value_as_smallest_unit: snprintf returned a negative value for input: %d\n", cache_size * physical_cores); return NULL; } - + uint32_t size = tmp1_len + 2 + tmp2_len + 7 + 1; sanity_ret = snprintf(string, size, "%s (%s Total)", tmp1, tmp2); diff --git a/src/main.c b/src/main.c index a0424ca..2edd2cd 100644 --- a/src/main.c +++ b/src/main.c @@ -6,7 +6,7 @@ #include "cpuid.h" #include "global.h" -static const char* VERSION = "0.59"; +static const char* VERSION = "0.510"; void print_help(char *argv[]) { printf("Usage: %s [--version] [--help] [--levels] [--style fancy|retro|legacy] [--color 'R,G,B:R,G,B:R,G,B:R,G,B']\n\