mirror of
https://github.com/Dr-Noob/cpufetch.git
synced 2026-03-25 16:00:39 +01:00
[v1.04][X86] Deduce CPU name for CPUs without support for extended cpuid leaf (e.g., no cpuid 0x80000002) (#220)
This commit is contained in:
@@ -486,9 +486,8 @@ struct cpuInfo* get_cpu_info(void) {
|
|||||||
cpu->cpu_name = get_str_cpu_name_internal();
|
cpu->cpu_name = get_str_cpu_name_internal();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
cpu->cpu_name = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN) + 1));
|
cpu->cpu_name = NULL;
|
||||||
strcpy(cpu->cpu_name, STRING_UNKNOWN);
|
printWarn("Can't read CPU name from cpuid (needed extended level is 0x%.8X, max is 0x%.8X)", 0x80000004, cpu->maxExtendedLevels);
|
||||||
printWarn("Can't read cpu name from cpuid (needed extended level is 0x%.8X, max is 0x%.8X)", 0x80000004, cpu->maxExtendedLevels);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu->topology_extensions = false;
|
cpu->topology_extensions = false;
|
||||||
@@ -556,6 +555,8 @@ struct cpuInfo* get_cpu_info(void) {
|
|||||||
if(cpu->topo == NULL) return cpu;
|
if(cpu->topo == NULL) return cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cpu->cpu_name == NULL)
|
||||||
|
cpu->cpu_name = infer_cpu_name_from_uarch(cpu->arch);
|
||||||
cpu->num_cpus = modules;
|
cpu->num_cpus = modules;
|
||||||
cpu->peak_performance = get_peak_performance(cpu, accurate_pp());
|
cpu->peak_performance = get_peak_performance(cpu, accurate_pp());
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,9 @@ enum {
|
|||||||
UARCH_UNKNOWN,
|
UARCH_UNKNOWN,
|
||||||
// INTEL //
|
// INTEL //
|
||||||
UARCH_P5,
|
UARCH_P5,
|
||||||
UARCH_P6,
|
UARCH_P5_MMX,
|
||||||
|
UARCH_P6_PENTIUM_II,
|
||||||
|
UARCH_P6_PENTIUM_III,
|
||||||
UARCH_DOTHAN,
|
UARCH_DOTHAN,
|
||||||
UARCH_YONAH,
|
UARCH_YONAH,
|
||||||
UARCH_MEROM,
|
UARCH_MEROM,
|
||||||
@@ -145,31 +147,31 @@ struct uarch* get_uarch_from_cpuid_intel(uint32_t ef, uint32_t f, uint32_t em, u
|
|||||||
// EM: Extended Model //
|
// EM: Extended Model //
|
||||||
// M: Model //
|
// M: Model //
|
||||||
// S: Stepping //
|
// S: Stepping //
|
||||||
// ----------------------------------------------------------------------------- //
|
// ------------------------------------------------------------------------------ //
|
||||||
// EF F EM M S //
|
// EF F EM M S //
|
||||||
UARCH_START
|
UARCH_START
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 0, NA, "P5", UARCH_P5, 800)
|
CHECK_UARCH(arch, 0, 5, 0, 0, NA, "P5", UARCH_P5, 800)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 1, NA, "P5", UARCH_P5, 800)
|
CHECK_UARCH(arch, 0, 5, 0, 1, NA, "P5", UARCH_P5, 800)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 2, NA, "P5", UARCH_P5, UNK)
|
CHECK_UARCH(arch, 0, 5, 0, 2, NA, "P5", UARCH_P5, UNK)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 3, NA, "P5", UARCH_P5, 600)
|
CHECK_UARCH(arch, 0, 5, 0, 3, NA, "P5", UARCH_P5, 600)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 4, NA, "P5 MMX", UARCH_P5, UNK)
|
CHECK_UARCH(arch, 0, 5, 0, 4, NA, "P5 (MMX)", UARCH_P5_MMX, UNK)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 7, NA, "P5 MMX", UARCH_P5, UNK)
|
CHECK_UARCH(arch, 0, 5, 0, 7, NA, "P5 (MMX)", UARCH_P5_MMX, UNK)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 8, NA, "P5 MMX", UARCH_P5, 250)
|
CHECK_UARCH(arch, 0, 5, 0, 8, NA, "P5 (MMX)", UARCH_P5_MMX, 250)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 9, 0, "Lakemont", UARCH_LAKEMONT, 32)
|
CHECK_UARCH(arch, 0, 5, 0, 9, 0, "Lakemont", UARCH_LAKEMONT, 32)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 9, NA, "P5 MMX", UARCH_P5, UNK)
|
CHECK_UARCH(arch, 0, 5, 0, 9, NA, "P5 (MMX)", UARCH_P5_MMX, UNK)
|
||||||
CHECK_UARCH(arch, 0, 5, 0, 10, 0, "Lakemont", UARCH_LAKEMONT, 32)
|
CHECK_UARCH(arch, 0, 5, 0, 10, 0, "Lakemont", UARCH_LAKEMONT, 32)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 0, NA, "P6 Pentium II", UARCH_P6, UNK)
|
CHECK_UARCH(arch, 0, 6, 0, 0, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_II, UNK)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 1, NA, "P6 Pentium II", UARCH_P6, UNK) // process depends on core
|
CHECK_UARCH(arch, 0, 6, 0, 1, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_II, UNK) // process depends on core
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 2, NA, "P6 Pentium II", UARCH_P6, UNK)
|
CHECK_UARCH(arch, 0, 6, 0, 2, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_II, UNK)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 3, NA, "P6 Pentium II", UARCH_P6, 350)
|
CHECK_UARCH(arch, 0, 6, 0, 3, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_II, 350)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 4, NA, "P6 Pentium II", UARCH_P6, UNK)
|
CHECK_UARCH(arch, 0, 6, 0, 4, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_II, UNK)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 5, NA, "P6 Pentium II", UARCH_P6, 250)
|
CHECK_UARCH(arch, 0, 6, 0, 5, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_II, 250)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 6, NA, "P6 Pentium II", UARCH_P6, UNK)
|
CHECK_UARCH(arch, 0, 6, 0, 6, NA, "P6 (Pentium II)", UARCH_P6_PENTIUM_III, UNK)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 7, NA, "P6 Pentium III", UARCH_P6, 250)
|
CHECK_UARCH(arch, 0, 6, 0, 7, NA, "P6 (Pentium III)", UARCH_P6_PENTIUM_III, 250)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 8, NA, "P6 Pentium III", UARCH_P6, 180)
|
CHECK_UARCH(arch, 0, 6, 0, 8, NA, "P6 (Pentium III)", UARCH_P6_PENTIUM_III, 180)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 9, NA, "P6 Pentium M", UARCH_P6, 130)
|
CHECK_UARCH(arch, 0, 6, 0, 9, NA, "P6 (Pentium M)", UARCH_P6_PENTIUM_III, 130)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 10, NA, "P6 Pentium III", UARCH_P6, 180)
|
CHECK_UARCH(arch, 0, 6, 0, 10, NA, "P6 (Pentium III)", UARCH_P6_PENTIUM_III, 180)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 11, NA, "P6 Pentium III", UARCH_P6, 130)
|
CHECK_UARCH(arch, 0, 6, 0, 11, NA, "P6 (Pentium III)", UARCH_P6_PENTIUM_III, 130)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 13, NA, "Dothan", UARCH_DOTHAN, UNK) // process depends on core
|
CHECK_UARCH(arch, 0, 6, 0, 13, NA, "Dothan", UARCH_DOTHAN, UNK) // process depends on core
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 14, NA, "Yonah", UARCH_YONAH, 65)
|
CHECK_UARCH(arch, 0, 6, 0, 14, NA, "Yonah", UARCH_YONAH, 65)
|
||||||
CHECK_UARCH(arch, 0, 6, 0, 15, NA, "Merom", UARCH_MEROM, 65)
|
CHECK_UARCH(arch, 0, 6, 0, 15, NA, "Merom", UARCH_MEROM, 65)
|
||||||
@@ -392,11 +394,16 @@ struct uarch* get_uarch_from_cpuid_amd(uint32_t ef, uint32_t f, uint32_t em, uin
|
|||||||
|
|
||||||
struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t dump, uint32_t ef, uint32_t f, uint32_t em, uint32_t m, int s) {
|
struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t dump, uint32_t ef, uint32_t f, uint32_t em, uint32_t m, int s) {
|
||||||
if(cpu->cpu_vendor == CPU_VENDOR_INTEL) {
|
if(cpu->cpu_vendor == CPU_VENDOR_INTEL) {
|
||||||
|
struct uarch* arch = emalloc(sizeof(struct uarch));
|
||||||
if(dump == 0x000806E9) {
|
if(dump == 0x000806E9) {
|
||||||
|
if (cpu->cpu_name == NULL) {
|
||||||
|
printErr("Unable to find uarch without CPU name");
|
||||||
|
fill_uarch(arch, STRING_UNKNOWN, UARCH_UNKNOWN, UNK);
|
||||||
|
return arch;
|
||||||
|
}
|
||||||
|
|
||||||
// It is not possible to determine uarch only from CPUID dump (can be Kaby Lake or Amber Lake)
|
// It is not possible to determine uarch only from CPUID dump (can be Kaby Lake or Amber Lake)
|
||||||
// See issue https://github.com/Dr-Noob/cpufetch/issues/122
|
// See issue https://github.com/Dr-Noob/cpufetch/issues/122
|
||||||
struct uarch* arch = emalloc(sizeof(struct uarch));
|
|
||||||
|
|
||||||
if(strstr(cpu->cpu_name, "Y") != NULL) {
|
if(strstr(cpu->cpu_name, "Y") != NULL) {
|
||||||
fill_uarch(arch, "Amber Lake", UARCH_AMBER_LAKE, 14);
|
fill_uarch(arch, "Amber Lake", UARCH_AMBER_LAKE, 14);
|
||||||
}
|
}
|
||||||
@@ -407,10 +414,14 @@ struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t dump, uint32_t
|
|||||||
return arch;
|
return arch;
|
||||||
}
|
}
|
||||||
else if (dump == 0x000806EA) {
|
else if (dump == 0x000806EA) {
|
||||||
|
if (cpu->cpu_name == NULL) {
|
||||||
|
printErr("Unable to find uarch without CPU name");
|
||||||
|
fill_uarch(arch, STRING_UNKNOWN, UARCH_UNKNOWN, UNK);
|
||||||
|
return arch;
|
||||||
|
}
|
||||||
|
|
||||||
// It is not possible to determine uarch only from CPUID dump (can be Kaby Lake R or Coffee Lake U)
|
// It is not possible to determine uarch only from CPUID dump (can be Kaby Lake R or Coffee Lake U)
|
||||||
// See issue https://github.com/Dr-Noob/cpufetch/issues/149
|
// See issue https://github.com/Dr-Noob/cpufetch/issues/149
|
||||||
struct uarch* arch = emalloc(sizeof(struct uarch));
|
|
||||||
|
|
||||||
if(strstr(cpu->cpu_name, "i5-8250U") != NULL ||
|
if(strstr(cpu->cpu_name, "i5-8250U") != NULL ||
|
||||||
strstr(cpu->cpu_name, "i5-8350U") != NULL ||
|
strstr(cpu->cpu_name, "i5-8350U") != NULL ||
|
||||||
strstr(cpu->cpu_name, "i7-8550U") != NULL ||
|
strstr(cpu->cpu_name, "i7-8550U") != NULL ||
|
||||||
@@ -429,6 +440,41 @@ struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t dump, uint32_t
|
|||||||
return get_uarch_from_cpuid_amd(ef, f, em, m, s);
|
return get_uarch_from_cpuid_amd(ef, f, em, m, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we cannot get the CPU name from CPUID, try to infer it from uarch
|
||||||
|
char* infer_cpu_name_from_uarch(struct uarch* arch) {
|
||||||
|
char* cpu_name = NULL;
|
||||||
|
if (arch == NULL) {
|
||||||
|
printErr("infer_cpu_name_from_uarch: Unable to find CPU name");
|
||||||
|
cpu_name = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN) + 1));
|
||||||
|
strcpy(cpu_name, STRING_UNKNOWN);
|
||||||
|
return cpu_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *str = NULL;
|
||||||
|
|
||||||
|
if (arch->uarch == UARCH_P5)
|
||||||
|
str = "Intel Pentium";
|
||||||
|
else if (arch->uarch == UARCH_P5_MMX)
|
||||||
|
str = "Intel Pentium MMX";
|
||||||
|
else if (arch->uarch == UARCH_P6_PENTIUM_II)
|
||||||
|
str = "Intel Pentium II";
|
||||||
|
else if (arch->uarch == UARCH_P6_PENTIUM_III)
|
||||||
|
str = "Intel Pentium III";
|
||||||
|
else
|
||||||
|
printErr("Unable to find name from uarch: %d", arch->uarch);
|
||||||
|
|
||||||
|
if (str == NULL) {
|
||||||
|
cpu_name = emalloc(sizeof(char) * (strlen(STRING_UNKNOWN) + 1));
|
||||||
|
strcpy(cpu_name, STRING_UNKNOWN);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
cpu_name = emalloc(sizeof(char) * (strlen(str)+1));
|
||||||
|
strcpy(cpu_name, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cpu_name;
|
||||||
|
}
|
||||||
|
|
||||||
bool vpus_are_AVX512(struct cpuInfo* cpu) {
|
bool vpus_are_AVX512(struct cpuInfo* cpu) {
|
||||||
return cpu->arch->uarch != UARCH_ICE_LAKE &&
|
return cpu->arch->uarch != UARCH_ICE_LAKE &&
|
||||||
cpu->arch->uarch != UARCH_TIGER_LAKE &&
|
cpu->arch->uarch != UARCH_TIGER_LAKE &&
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
struct uarch;
|
struct uarch;
|
||||||
|
|
||||||
struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t dump, uint32_t ef, uint32_t f, uint32_t em, uint32_t m, int s);
|
struct uarch* get_uarch_from_cpuid(struct cpuInfo* cpu, uint32_t dump, uint32_t ef, uint32_t f, uint32_t em, uint32_t m, int s);
|
||||||
|
char* infer_cpu_name_from_uarch(struct uarch* arch);
|
||||||
bool vpus_are_AVX512(struct cpuInfo* cpu);
|
bool vpus_are_AVX512(struct cpuInfo* cpu);
|
||||||
bool is_knights_landing(struct cpuInfo* cpu);
|
bool is_knights_landing(struct cpuInfo* cpu);
|
||||||
int get_number_of_vpus(struct cpuInfo* cpu);
|
int get_number_of_vpus(struct cpuInfo* cpu);
|
||||||
|
|||||||
Reference in New Issue
Block a user