[v0.82][ARM][ASCII][Refactoring] ARM ascii changes. Remove the assumption that all sockets are equal in a ARM based SoC. Little more support for ARM processors. Add ARM color style

This commit is contained in:
Dr-Noob
2020-11-06 10:02:59 +01:00
parent 4f1722ead6
commit 9c8e169592
7 changed files with 130 additions and 14 deletions

View File

@@ -9,13 +9,92 @@
#define STRING_UNKNOWN "Unknown" #define STRING_UNKNOWN "Unknown"
int count_distinct(uint32_t* arr, int n) {
int res = 1;
for (int i = 1; i < n; i++) {
int j = 0;
for (j = 0; j < i; j++) {
if (arr[i] == arr[j])
break;
}
if (i == j)
res++;
}
return res;
}
uint32_t fill_ids_from_midr(uint32_t* midr_array, uint32_t* ids_array, int len) {
uint32_t latest_id = 0;
bool found;
ids_array[0] = latest_id;
for (int i = 1; i < len; i++) {
int j = 0;
found = false;
for (j = 0; j < len && !found; j++) {
if (i != j && midr_array[i] == midr_array[j]) {
if(j > i) {
latest_id++;
ids_array[i] = latest_id;
}
else {
ids_array[i] = ids_array[j];
}
found = true;
}
}
if(!found) {
latest_id++;
ids_array[i] = latest_id;
}
}
return latest_id+1;
}
VENDOR get_vendor_from_midr(uint32_t midr) {
return CPU_VENDOR_ARM;
}
char* get_name_from_midr(uint32_t midr) {
char* name = malloc(sizeof(char) * CPU_NAME_MAX_LENGTH);
strcpy(name, "Unknown");
return name;
}
struct cpuInfo* get_cpu_info() { struct cpuInfo* get_cpu_info() {
struct cpuInfo* cpu = malloc(sizeof(struct cpuInfo)); struct cpuInfo* cpu = malloc(sizeof(struct cpuInfo));
cpu->next_cpu = NULL;
int ncores = get_ncores_from_cpuinfo();
uint32_t* midr_array = malloc(sizeof(uint32_t) * ncores);
uint32_t* ids_array = malloc(sizeof(uint32_t) * ncores);
for(int i=0; i < ncores; i++) {
midr_array[i] = get_midr_from_cpuinfo(i);
}
uint32_t sockets = fill_ids_from_midr(midr_array, ids_array, ncores);
struct cpuInfo* ptr = cpu;
int midr_idx = 0;
int tmp_midr_idx = 0;
for(uint32_t i=0; i < sockets; i++) {
if(i > 0) {
ptr->next_cpu = malloc(sizeof(struct cpuInfo));
ptr = ptr->next_cpu;
tmp_midr_idx = midr_idx;
while(midr_array[midr_idx] == midr_array[tmp_midr_idx]) tmp_midr_idx++;
midr_idx = tmp_midr_idx;
}
ptr->midr = midr_array[midr_idx];
ptr->cpu_vendor = get_vendor_from_midr(ptr->midr);
ptr->cpu_name = get_name_from_midr(ptr->midr);
}
cpu->midr = get_midr_from_cpuinfo(0);
cpu->cpu_vendor = CPU_VENDOR_UNKNOWN;
cpu->cpu_name = malloc(sizeof(char) * CPU_NAME_MAX_LENGTH);
strcpy(cpu->cpu_name, "Unknown");
cpu->arch = NULL; cpu->arch = NULL;
cpu->hv = malloc(sizeof(struct hypervisor)); cpu->hv = malloc(sizeof(struct hypervisor));
cpu->hv->present = false; cpu->hv->present = false;

View File

@@ -7,6 +7,7 @@
#define COLOR_STR_INTEL "intel" #define COLOR_STR_INTEL "intel"
#define COLOR_STR_AMD "amd" #define COLOR_STR_AMD "amd"
#define COLOR_STR_ARM "arm"
static const char *SYTLES_STR_LIST[] = { static const char *SYTLES_STR_LIST[] = {
[STYLE_EMPTY] = NULL, [STYLE_EMPTY] = NULL,
@@ -107,6 +108,11 @@ bool parse_color(char* optarg, struct colors** cs) {
strcpy(str_to_parse, COLOR_DEFAULT_AMD); strcpy(str_to_parse, COLOR_DEFAULT_AMD);
free_ptr = true; free_ptr = true;
} }
else if(strcmp(optarg, COLOR_STR_ARM) == 0) {
str_to_parse = malloc(sizeof(char) * 46);
strcpy(str_to_parse, COLOR_DEFAULT_ARM);
free_ptr = true;
}
else { else {
str_to_parse = optarg; str_to_parse = optarg;
free_ptr = false; free_ptr = false;

View File

@@ -52,14 +52,14 @@
\ \
\ \
\ \
####### #### ########## #### ###### ######## \ ############ ########## #### ###### ######## \
############### ######### ####################### \ ############### ######### ####################### \
#### #### #### ##### ####### ##### \ #### #### #### ##### ####### ##### \
#### #### #### #### ##### #### \ #### #### #### #### ##### #### \
#### #### #### #### #### #### \ #### #### #### #### #### #### \
#### ##### #### #### #### #### \ #### ##### #### #### #### #### \
############### #### #### #### #### \ ############### #### #### #### #### \
######## #### ### #### #### #### \ ######## #### #### #### #### #### \
\ \
\ \
\ \

View File

@@ -68,13 +68,20 @@ struct cpuInfo {
uint32_t maxLevels; uint32_t maxLevels;
// Max cpuids extended levels // Max cpuids extended levels
uint32_t maxExtendedLevels; uint32_t maxExtendedLevels;
#else #elif ARCH_ARM
// Main ID register // Main ID register
uint32_t midr; uint32_t midr;
#endif #endif
struct uarch* arch; struct uarch* arch;
struct hypervisor* hv; struct hypervisor* hv;
#ifdef ARCH_ARM
// If SoC contains more than one CPU and they
// are different, the others will be stored in
// the next_cpu field
struct cpuInfo* next_cpu;
#endif
}; };
struct cach { struct cach {

View File

@@ -13,7 +13,7 @@
#include "../arm/midr.h" #include "../arm/midr.h"
#endif #endif
static const char* VERSION = "0.81"; static const char* VERSION = "0.82";
void print_help(char *argv[]) { void print_help(char *argv[]) {
#ifdef ARCH_X86 #ifdef ARCH_X86
@@ -25,9 +25,10 @@ void print_help(char *argv[]) {
printf("Options: \n\ printf("Options: \n\
--color Set the color scheme. By default, cpufetch uses the system color scheme. This option \n\ --color Set the color scheme. By default, cpufetch uses the system color scheme. This option \n\
lets the user use different colors to print the CPU art: \n\ lets the user use different colors to print the CPU art: \n\
* \"intel\": Use intel default color scheme \n\ * \"intel\": Use Intel default color scheme \n\
* \"amd\": Use amd default color scheme \n\ * \"amd\": Use AMD default color scheme \n\
* custom: If color do not match \"intel\" or \"amd\", a custom scheme can be specified: \n\ * \"arm\": Use ARM default color scheme \n\
* custom: If color argument do not match \"Intel\", \"AMD\" or \"ARM\", a custom scheme can be specified: \n\
4 colors must be given in RGB with the format: R,G,B:R,G,B:... \n\ 4 colors must be given in RGB with the format: R,G,B:R,G,B:... \n\
These colors correspond to CPU art color (2 colors) and for the text colors (following 2) \n\ These colors correspond to CPU art color (2 colors) and for the text colors (following 2) \n\
For example: --color 239,90,45:210,200,200:100,200,45:0,200,200 \n\n\ For example: --color 239,90,45:210,200,200:100,200,45:0,200,200 \n\n\

View File

@@ -28,12 +28,21 @@
#define COL_INTEL_FANCY_4 "\x1b[37;1m" #define COL_INTEL_FANCY_4 "\x1b[37;1m"
#define COL_INTEL_RETRO_1 "\x1b[36;1m" #define COL_INTEL_RETRO_1 "\x1b[36;1m"
#define COL_INTEL_RETRO_2 "\x1b[37;1m" #define COL_INTEL_RETRO_2 "\x1b[37;1m"
#define COL_AMD_FANCY_1 "\x1b[47;1m" #define COL_AMD_FANCY_1 "\x1b[47;1m"
#define COL_AMD_FANCY_2 "\x1b[42;1m" #define COL_AMD_FANCY_2 "\x1b[42;1m"
#define COL_AMD_FANCY_3 "\x1b[37;1m" #define COL_AMD_FANCY_3 "\x1b[37;1m"
#define COL_AMD_FANCY_4 "\x1b[32;1m" #define COL_AMD_FANCY_4 "\x1b[32;1m"
#define COL_AMD_RETRO_1 "\x1b[37;1m" #define COL_AMD_RETRO_1 "\x1b[37;1m"
#define COL_AMD_RETRO_2 "\x1b[32;1m" #define COL_AMD_RETRO_2 "\x1b[32;1m"
#define COL_ARM_FANCY_1 "\x1b[46;1m"
#define COL_ARM_FANCY_2 "\x1b[46;1m"
#define COL_ARM_FANCY_3 "\x1b[37;1m"
#define COL_ARM_FANCY_4 "\x1b[36;1m"
#define COL_ARM_RETRO_1 "\x1b[36;1m"
#define COL_ARM_RETRO_2 "\x1b[37;1m"
#define COL_UNKNOWN_FANCY_1 "\x1b[47;1m" #define COL_UNKNOWN_FANCY_1 "\x1b[47;1m"
#define COL_UNKNOWN_FANCY_2 "\x1b[47;1m" #define COL_UNKNOWN_FANCY_2 "\x1b[47;1m"
#define COL_UNKNOWN_FANCY_3 "\x1b[37;1m" #define COL_UNKNOWN_FANCY_3 "\x1b[37;1m"
@@ -182,6 +191,17 @@ struct ascii* set_ascii(VENDOR cpuVendor, STYLE style, struct colors* cs) {
COL_RETRO_4 = COL_AMD_RETRO_2; COL_RETRO_4 = COL_AMD_RETRO_2;
art->ascii_chars[0] = '@'; art->ascii_chars[0] = '@';
} }
else if(art->vendor == CPU_VENDOR_ARM) {
COL_FANCY_1 = COL_ARM_FANCY_1;
COL_FANCY_2 = COL_ARM_FANCY_2;
COL_FANCY_3 = COL_ARM_FANCY_3;
COL_FANCY_4 = COL_ARM_FANCY_4;
COL_RETRO_1 = COL_ARM_RETRO_1;
COL_RETRO_2 = COL_ARM_RETRO_2;
COL_RETRO_3 = COL_ARM_RETRO_1;
COL_RETRO_4 = COL_ARM_RETRO_2;
art->ascii_chars[0] = '#';
}
else { else {
COL_FANCY_1 = COL_UNKNOWN_FANCY_1; COL_FANCY_1 = COL_UNKNOWN_FANCY_1;
COL_FANCY_2 = COL_UNKNOWN_FANCY_2; COL_FANCY_2 = COL_UNKNOWN_FANCY_2;
@@ -190,7 +210,7 @@ struct ascii* set_ascii(VENDOR cpuVendor, STYLE style, struct colors* cs) {
COL_RETRO_1 = COL_UNKNOWN_RETRO; COL_RETRO_1 = COL_UNKNOWN_RETRO;
COL_RETRO_2 = COL_UNKNOWN_RETRO; COL_RETRO_2 = COL_UNKNOWN_RETRO;
COL_RETRO_3 = COL_UNKNOWN_RETRO; COL_RETRO_3 = COL_UNKNOWN_RETRO;
COL_RETRO_4 = COL_UNKNOWN_RETRO; COL_RETRO_4 = COL_UNKNOWN_RETRO;
art->ascii_chars[0] = '#'; art->ascii_chars[0] = '#';
} }
art->ascii_chars[1] = '#'; art->ascii_chars[1] = '#';
@@ -198,14 +218,14 @@ struct ascii* set_ascii(VENDOR cpuVendor, STYLE style, struct colors* cs) {
#ifdef _WIN32 #ifdef _WIN32
HANDLE std_handle = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE std_handle = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD console_mode; DWORD console_mode;
// Attempt to enable the VT100-processing flag // Attempt to enable the VT100-processing flag
GetConsoleMode(std_handle, &console_mode); GetConsoleMode(std_handle, &console_mode);
SetConsoleMode(std_handle, console_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); SetConsoleMode(std_handle, console_mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
// Get the console mode flag again, to see if it successfully enabled it // Get the console mode flag again, to see if it successfully enabled it
GetConsoleMode(std_handle, &console_mode); GetConsoleMode(std_handle, &console_mode);
#endif #endif
if(style == STYLE_EMPTY) { if(style == STYLE_EMPTY) {
#ifdef _WIN32 #ifdef _WIN32
// Use fancy style if VT100-processing is enabled, // Use fancy style if VT100-processing is enabled,
@@ -276,6 +296,8 @@ struct ascii* set_ascii(VENDOR cpuVendor, STYLE style, struct colors* cs) {
strcpy(tmp, INTEL_ASCII); strcpy(tmp, INTEL_ASCII);
else if(art->vendor == CPU_VENDOR_AMD) else if(art->vendor == CPU_VENDOR_AMD)
strcpy(tmp, AMD_ASCII); strcpy(tmp, AMD_ASCII);
else if(art->vendor == CPU_VENDOR_ARM)
strcpy(tmp, ARM_ASCII);
else else
strcpy(tmp, UNKNOWN_ASCII); strcpy(tmp, UNKNOWN_ASCII);

View File

@@ -13,6 +13,7 @@ typedef int STYLE;
#define COLOR_DEFAULT_INTEL "15,125,194:230,230,230:40,150,220:230,230,230" #define COLOR_DEFAULT_INTEL "15,125,194:230,230,230:40,150,220:230,230,230"
#define COLOR_DEFAULT_AMD "250,250,250:0,154,102:250,250,250:0,154,102" #define COLOR_DEFAULT_AMD "250,250,250:0,154,102:250,250,250:0,154,102"
#define COLOR_DEFAULT_ARM "0,145,189:0,145,189:240,240,240:0,145,189"
#ifdef ARCH_X86 #ifdef ARCH_X86
void print_levels(struct cpuInfo* cpu); void print_levels(struct cpuInfo* cpu);