mirror of
https://github.com/Dr-Noob/cpufetch.git
synced 2026-03-26 00:10:38 +01:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3719dc216 | ||
|
|
7a3fd539c3 | ||
|
|
f6bf00e33d | ||
|
|
985bd6f25f | ||
|
|
f599613f5e |
@@ -3,8 +3,6 @@
|
|||||||
#include "midr.h"
|
#include "midr.h"
|
||||||
|
|
||||||
#define _PATH_DEVICETREE_MODEL "/sys/firmware/devicetree/base/model"
|
#define _PATH_DEVICETREE_MODEL "/sys/firmware/devicetree/base/model"
|
||||||
#define _PATH_CPUINFO "/proc/cpuinfo"
|
|
||||||
//#define _PATH_CPUINFO "cpuinfo_debug"
|
|
||||||
|
|
||||||
#define CPUINFO_CPU_IMPLEMENTER_STR "CPU implementer\t: "
|
#define CPUINFO_CPU_IMPLEMENTER_STR "CPU implementer\t: "
|
||||||
#define CPUINFO_CPU_ARCHITECTURE_STR "CPU architecture: "
|
#define CPUINFO_CPU_ARCHITECTURE_STR "CPU architecture: "
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef GIT_FULL_VERSION
|
#ifndef GIT_FULL_VERSION
|
||||||
static const char* VERSION = "1.03";
|
static const char* VERSION = "1.04";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#include "../common/global.h"
|
#include "../common/global.h"
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
|
|
||||||
#define _PATH_CPUINFO "/proc/cpuinfo"
|
|
||||||
#define _PATH_DEVTREE "/proc/device-tree/compatible"
|
#define _PATH_DEVTREE "/proc/device-tree/compatible"
|
||||||
#define CPUINFO_UARCH_STR "uarch\t\t: "
|
#define CPUINFO_UARCH_STR "uarch\t\t: "
|
||||||
#define CPUINFO_EXTENSIONS_STR "isa\t\t: "
|
#define CPUINFO_EXTENSIONS_STR "isa\t\t: "
|
||||||
|
|||||||
121
src/x86/cpuid.c
121
src/x86/cpuid.c
@@ -261,23 +261,29 @@ struct hypervisor* get_hp_info(bool hv_present) {
|
|||||||
|
|
||||||
cpuid(&eax, &ebx, &ecx, &edx);
|
cpuid(&eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
char name[13];
|
if(ebx == 0x0 && ecx == 0x0 && edx == 0x0) {
|
||||||
memset(name, 0, 13);
|
|
||||||
get_name_cpuid(name, ebx, ecx, edx);
|
|
||||||
|
|
||||||
bool found = false;
|
|
||||||
uint8_t len = sizeof(hv_vendors_string) / sizeof(hv_vendors_string[0]);
|
|
||||||
|
|
||||||
for(uint8_t v=0; v < len && !found; v++) {
|
|
||||||
if(hv_vendors_string[v] != NULL && strcmp(hv_vendors_string[v], name) == 0) {
|
|
||||||
hv->hv_vendor = v;
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!found) {
|
|
||||||
hv->hv_vendor = HV_VENDOR_INVALID;
|
hv->hv_vendor = HV_VENDOR_INVALID;
|
||||||
printBug("Unknown hypervisor vendor: %s", name);
|
printWarn("Hypervisor vendor is empty");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char name[13];
|
||||||
|
memset(name, 0, 13);
|
||||||
|
get_name_cpuid(name, ebx, ecx, edx);
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
uint8_t len = sizeof(hv_vendors_string) / sizeof(hv_vendors_string[0]);
|
||||||
|
|
||||||
|
for(uint8_t v=0; v < len && !found; v++) {
|
||||||
|
if(hv_vendors_string[v] != NULL && strcmp(hv_vendors_string[v], name) == 0) {
|
||||||
|
hv->hv_vendor = v;
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!found) {
|
||||||
|
hv->hv_vendor = HV_VENDOR_INVALID;
|
||||||
|
printBug("Unknown hypervisor vendor: %s", name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
hv->hv_name = hv_vendors_name[hv->hv_vendor];
|
hv->hv_name = hv_vendors_name[hv->hv_vendor];
|
||||||
@@ -626,6 +632,7 @@ bool get_cache_topology_amd(struct cpuInfo* cpu, struct topology* topo) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
void get_topology_from_udev(struct topology* topo) {
|
void get_topology_from_udev(struct topology* topo) {
|
||||||
// TODO: To be improved in the future
|
// TODO: To be improved in the future
|
||||||
topo->total_cores = get_ncores_from_cpuinfo();
|
topo->total_cores = get_ncores_from_cpuinfo();
|
||||||
@@ -635,6 +642,7 @@ void get_topology_from_udev(struct topology* topo) {
|
|||||||
topo->smt_supported = 1;
|
topo->smt_supported = 1;
|
||||||
topo->sockets = 1;
|
topo->sockets = 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Main reference: https://software.intel.com/content/www/us/en/develop/articles/intel-64-architecture-processor-topology-enumeration.html
|
// Main reference: https://software.intel.com/content/www/us/en/develop/articles/intel-64-architecture-processor-topology-enumeration.html
|
||||||
// Very interesting resource: https://wiki.osdev.org/Detecting_CPU_Topology_(80x86)
|
// Very interesting resource: https://wiki.osdev.org/Detecting_CPU_Topology_(80x86)
|
||||||
@@ -1085,12 +1093,29 @@ void print_debug(struct cpuInfo* cpu) {
|
|||||||
free_cpuinfo_struct(cpu);
|
free_cpuinfo_struct(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Query HV and Xeon Phi levels
|
void print_raw_level(uint32_t reg) {
|
||||||
|
uint32_t eax = reg;
|
||||||
|
uint32_t ebx = 0;
|
||||||
|
uint32_t ecx = 0;
|
||||||
|
uint32_t edx = 0;
|
||||||
|
|
||||||
|
cpuid(&eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
|
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, 0x00, eax, ebx, ecx, edx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_raw_sublevel(uint32_t reg, uint32_t reg2) {
|
||||||
|
uint32_t eax = reg;
|
||||||
|
uint32_t ebx = 0;
|
||||||
|
uint32_t ecx = reg2;
|
||||||
|
uint32_t edx = 0;
|
||||||
|
|
||||||
|
cpuid(&eax, &ebx, &ecx, &edx);
|
||||||
|
|
||||||
|
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, reg2, eax, ebx, ecx, edx);
|
||||||
|
}
|
||||||
|
|
||||||
void print_raw(struct cpuInfo* cpu) {
|
void print_raw(struct cpuInfo* cpu) {
|
||||||
uint32_t eax;
|
|
||||||
uint32_t ebx;
|
|
||||||
uint32_t ecx;
|
|
||||||
uint32_t edx;
|
|
||||||
printf("%s\n\n", cpu->cpu_name);
|
printf("%s\n\n", cpu->cpu_name);
|
||||||
printf(" CPUID leaf sub EAX EBX ECX EDX \n");
|
printf(" CPUID leaf sub EAX EBX ECX EDX \n");
|
||||||
printf("--------------------------------------------------------------\n");
|
printf("--------------------------------------------------------------\n");
|
||||||
@@ -1105,66 +1130,40 @@ void print_raw(struct cpuInfo* cpu) {
|
|||||||
|
|
||||||
printf("CPU %d:\n", c);
|
printf("CPU %d:\n", c);
|
||||||
|
|
||||||
|
// Standard levels
|
||||||
for(uint32_t reg=0x00000000; reg <= cpu->maxLevels; reg++) {
|
for(uint32_t reg=0x00000000; reg <= cpu->maxLevels; reg++) {
|
||||||
if(reg == 0x00000004) {
|
if(reg == 0x00000004) {
|
||||||
for(uint32_t reg2=0x00000000; reg2 < cpu->cach->max_cache_level; reg2++) {
|
for(uint32_t reg2=0x00000000; reg2 < cpu->cach->max_cache_level; reg2++) {
|
||||||
eax = reg;
|
print_raw_sublevel(reg, reg2);
|
||||||
ebx = 0;
|
|
||||||
ecx = reg2;
|
|
||||||
edx = 0;
|
|
||||||
|
|
||||||
cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, reg2, eax, ebx, ecx, edx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(reg == 0x0000000B) {
|
else if(reg == 0x0000000B) {
|
||||||
for(uint32_t reg2=0x00000000; reg2 < cpu->topo->smt_supported; reg2++) {
|
for(uint32_t reg2=0x00000000; reg2 < cpu->topo->smt_supported; reg2++) {
|
||||||
eax = reg;
|
print_raw_sublevel(reg, reg2);
|
||||||
ebx = 0;
|
|
||||||
ecx = reg2;
|
|
||||||
edx = 0;
|
|
||||||
|
|
||||||
cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, reg2, eax, ebx, ecx, edx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
eax = reg;
|
print_raw_level(reg);
|
||||||
ebx = 0;
|
|
||||||
ecx = 0;
|
|
||||||
edx = 0;
|
|
||||||
|
|
||||||
cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, 0x00, eax, ebx, ecx, edx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hypervisor levels
|
||||||
|
for(uint32_t reg=0x40000000; reg <= 0x40000006; reg++) {
|
||||||
|
print_raw_level(reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Extended levels
|
||||||
for(uint32_t reg=0x80000000; reg <= cpu->maxExtendedLevels; reg++) {
|
for(uint32_t reg=0x80000000; reg <= cpu->maxExtendedLevels; reg++) {
|
||||||
if(reg == 0x8000001D) {
|
if(reg == 0x8000001D) {
|
||||||
for(uint32_t reg2=0x00000000; reg2 < cpu->cach->max_cache_level; reg2++) {
|
for(uint32_t reg2=0x00000000; reg2 < cpu->cach->max_cache_level; reg2++) {
|
||||||
eax = reg;
|
print_raw_sublevel(reg, reg2);
|
||||||
ebx = 0;
|
|
||||||
ecx = reg2;
|
|
||||||
edx = 0;
|
|
||||||
|
|
||||||
cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, reg2, eax, ebx, ecx, edx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
eax = reg;
|
print_raw_level(reg);
|
||||||
ebx = 0;
|
|
||||||
ecx = 0;
|
|
||||||
edx = 0;
|
|
||||||
|
|
||||||
cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
printf(" 0x%.8X 0x%.2X: 0x%.8X 0x%.8X 0x%.8X 0x%.8X\n", reg, 0x00, eax, ebx, ecx, edx);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user