Complete topology read in AMD

This commit is contained in:
Dr-Noob
2020-07-06 01:58:48 +02:00
parent 7164409ca2
commit e114bde128
5 changed files with 34 additions and 13 deletions

View File

@@ -243,3 +243,19 @@ bool get_topology_from_apic(uint32_t cpuid_max_levels, struct topology** topo) {
return ret; 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;
}

View File

@@ -13,5 +13,6 @@ struct apic {
}; };
bool get_topology_from_apic(uint32_t cpuid_max_levels, struct topology** topo); bool get_topology_from_apic(uint32_t cpuid_max_levels, struct topology** topo);
uint32_t is_smt_enabled(struct topology* topo);
#endif #endif

View File

@@ -173,7 +173,7 @@ bool parse_args(int argc, char* argv[]) {
} }
args.style = parse_style(optarg); args.style = parse_style(optarg);
if(args.style == STYLE_INVALID) { if(args.style == STYLE_INVALID) {
printErr("Invalid style '%s'\n",optarg); printErr("Invalid style '%s'",optarg);
return false; return false;
} }
} }

View File

@@ -316,24 +316,28 @@ struct topology* get_topology_info(struct cpuInfo* cpu) {
else { else {
printWarn("Can't read topology information from cpuid (needed extended level is 0x%.8X, max is 0x%.8X)", 0x8000001E, cpu->maxExtendedLevels); 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_supported = 1;
topo->smt_available = 1;
} }
topo->physical_cores = topo->logical_cores / topo->smt_available;
} }
else { 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->physical_cores = 1;
topo->logical_cores = 1; topo->logical_cores = 1;
topo->smt_supported = 1; topo->smt_supported = 1;
topo->smt_available = 1;
} }
if (cpu->maxLevels >= 0x0000000B) { if (cpu->maxLevels >= 0x0000000B) {
//topo->smt_supported = is_smt_enabled(topo); topo->smt_available = is_smt_enabled(topo);
} }
else { else {
printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x80000008, cpu->maxLevels); printWarn("Can't read topology information from cpuid (needed level is 0x%.8X, max is 0x%.8X)", 0x0000000B, cpu->maxLevels);
topo->smt_supported = 1; 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; break;
default: default:
printBug("Cant get topology because VENDOR is empty"); printBug("Cant get topology because VENDOR is empty");

View File

@@ -6,7 +6,7 @@
#include "cpuid.h" #include "cpuid.h"
#include "global.h" #include "global.h"
static const char* VERSION = "0.59"; static const char* VERSION = "0.510";
void print_help(char *argv[]) { 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\ printf("Usage: %s [--version] [--help] [--levels] [--style fancy|retro|legacy] [--color 'R,G,B:R,G,B:R,G,B:R,G,B']\n\