[v1.02][x86] Detect and print core type in ADL

This commit is contained in:
Dr-Noob
2022-12-02 21:25:30 +00:00
parent d879b06d08
commit b2aa8194c6
3 changed files with 36 additions and 1 deletions

View File

@@ -35,6 +35,12 @@ enum {
HV_VENDOR_INVALID HV_VENDOR_INVALID
}; };
enum {
CORE_TYPE_EFFICIENCY,
CORE_TYPE_PERFORMANCE,
CORE_TYPE_UNKNOWN
};
#define UNKNOWN_DATA -1 #define UNKNOWN_DATA -1
#define CPU_NAME_MAX_LENGTH 64 #define CPU_NAME_MAX_LENGTH 64
@@ -134,6 +140,8 @@ struct cpuInfo {
bool topology_extensions; bool topology_extensions;
// Hybrid Flag (Intel only) // Hybrid Flag (Intel only)
bool hybrid_flag; bool hybrid_flag;
// Core Type (P/E)
uint32_t core_type;
#elif ARCH_PPC #elif ARCH_PPC
uint32_t pvr; uint32_t pvr;
#elif ARCH_ARM #elif ARCH_ARM

View File

@@ -565,7 +565,10 @@ bool print_cpufetch_x86(struct cpuInfo* cpu, STYLE s, struct color** cs, struct
} }
if(hybrid_architecture) { if(hybrid_architecture) {
sprintf(cpu_num, "CPU %d:", i+1); if(ptr->core_type == CORE_TYPE_EFFICIENCY) sprintf(cpu_num, "E-cores:");
else if(ptr->core_type == CORE_TYPE_PERFORMANCE) sprintf(cpu_num, "P-cores:");
else printBug("Found invalid core type!\n");
setAttribute(art, ATTRIBUTE_CPU_NUM, cpu_num); setAttribute(art, ATTRIBUTE_CPU_NUM, cpu_num);
} }
setAttribute(art, ATTRIBUTE_FREQUENCY, max_frequency); setAttribute(art, ATTRIBUTE_FREQUENCY, max_frequency);

View File

@@ -402,6 +402,24 @@ bool set_cpu_module(int m, int total_modules, int32_t* first_core) {
return true; return true;
} }
int32_t get_core_type() {
uint32_t eax = 0x0000001A;
uint32_t ebx = 0;
uint32_t ecx = 0;
uint32_t edx = 0;
eax = 0x0000001A;
cpuid(&eax, &ebx, &ecx, &edx);
int32_t type = eax >> 24 & 0xFF;
if(type == 0x20) return CORE_TYPE_EFFICIENCY;
else if(type == 0x40) return CORE_TYPE_PERFORMANCE;
else {
printErr("Found invalid core type: 0x%.8X\n", type);
return CORE_TYPE_UNKNOWN;
}
}
struct cpuInfo* get_cpu_info() { struct cpuInfo* get_cpu_info() {
struct cpuInfo* cpu = emalloc(sizeof(struct cpuInfo)); struct cpuInfo* cpu = emalloc(sizeof(struct cpuInfo));
cpu->peak_performance = -1; cpu->peak_performance = -1;
@@ -490,6 +508,12 @@ struct cpuInfo* get_cpu_info() {
ptr->hybrid_flag = cpu->hybrid_flag; ptr->hybrid_flag = cpu->hybrid_flag;
} }
if(cpu->hybrid_flag) {
// Detect core type
eax = 0x0000001A;
cpuid(&eax, &ebx, &ecx, &edx);
ptr->core_type = get_core_type();
}
ptr->first_core_id = first_core; ptr->first_core_id = first_core;
ptr->feat = get_features_info(ptr); ptr->feat = get_features_info(ptr);