1 Commits

Author SHA1 Message Date
bb075099b6 Shell: improve cpuid - view full brand string
All checks were successful
Build system / Check kernel codestyle (pull_request) Successful in 1m21s
Build system / Build (pull_request) Successful in 16m21s
2025-12-31 17:09:17 +03:00
4 changed files with 246 additions and 238 deletions

1
.gitignore vendored
View File

@@ -9,3 +9,4 @@ ehthumbs_vista.db
._* ._*
programs/cmm/cmm.code-workspace programs/cmm/cmm.code-workspace
programs/cmm/menu/.gitignore programs/cmm/menu/.gitignore
.vscode

View File

@@ -26,8 +26,8 @@ int cmd_kfetch(char param[]) {
char str_resolution[24]; char str_resolution[24];
ksys_pos_t resol = _ksys_screen_size(); ksys_pos_t resol = _ksys_screen_size();
sprintf(str_resolution, "%u x %u", resol.x + 1, resol.y + 1); sprintf(str_resolution, "%u x %u", resol.x + 1, resol.y + 1);
char str_cpu_info[16]; char str_cpu_info[50];
get_str_cpu_info(str_cpu_info); get_cpu_brand_string(str_cpu_info);
char str_meminfo[24]; char str_meminfo[24];
get_str_meminfo(str_meminfo); get_str_meminfo(str_meminfo);
@@ -53,7 +53,7 @@ int cmd_kfetch(char param[]) {
"\033[0;34;40m \033[0;31;40m \033[0;32;40mS\033[0;34;40m@\033[0;5;34;40mX\033[0;1;35;45m.\033[0;1;34;44m8\033[0;5;35;45m \033[0;5;34;44m \033[0;1;30;45m8\033[0;5;35;44m:\033[0;5;37;45m@\033[0;1;30;40m8\033[0;31;40m.\033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r" "\033[0;34;40m \033[0;31;40m \033[0;32;40mS\033[0;34;40m@\033[0;5;34;40mX\033[0;1;35;45m.\033[0;1;34;44m8\033[0;5;35;45m \033[0;5;34;44m \033[0;1;30;45m8\033[0;5;35;44m:\033[0;5;37;45m@\033[0;1;30;40m8\033[0;31;40m.\033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r"
"\033[0;34;40m \033[0;31;40m \033[0;32;40m \033[0;31;40m.\033[0;32;40m;\033[0;34;40m;8\033[0;32;40m%%\033[0;5;34;40m8\033[0;34;40m8\033[0;1;30;44m8\033[0;1;30;40m8\033[0;34;40m;.\033[0;31;40m \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r" "\033[0;34;40m \033[0;31;40m \033[0;32;40m \033[0;31;40m.\033[0;32;40m;\033[0;34;40m;8\033[0;32;40m%%\033[0;5;34;40m8\033[0;34;40m8\033[0;1;30;44m8\033[0;1;30;40m8\033[0;34;40m;.\033[0;31;40m \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r"
"\033[0;34;40m \033[0;32;40m \033[0;31;40m \033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m:. \033[0;32;40m. \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r", "\033[0;34;40m \033[0;32;40m \033[0;31;40m \033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m.\033[0;32;40m.\033[0;31;40m:. \033[0;32;40m. \033[0;34;40m \033[0;31;40m \033[0;34;40m \033[0m\n\r",
"\033[0;36mOS\033[0m: KolibriOS ", str_os_rel_offset_dbgtag, "\033[0;36mKernel\033[0m: ", str_krn_abi_cmtid, "\033[0;36mUptime\033[0m: ", str_uptime, "\033[0;36mResolution\033[0m: ", str_resolution, "\033[0;36mCPU\033[0m: ", str_cpu_info, "\033[0;36mMemory\033[0m: ", str_meminfo "\033[0;36mOS\033[0m: KolibriOS ", str_os_rel_offset_dbgtag, "\033[0;36mKernel\033[0m: ", str_krn_abi_cmtid, "\033[0;36mUptime\033[0m: ", str_uptime, "\033[0;36mResolution\033[0m: ", str_resolution, "\033[0;36mCPU\033[0m: ", str_cpu_info, "\033[0;36mMemory\033[0m: ", str_meminfo
); );

View File

@@ -1,65 +1,72 @@
#include "../system/kolibri.h" #include "../system/kolibri.h"
void get_str_kernel_version(char *str, const char *fmt) { void get_str_kernel_version(char *str, const char *fmt) {
struct kernel_version kv; struct kernel_version kv;
kol_get_kernel_ver(&kv); kol_get_kernel_ver(&kv);
char str_offset[8] = {'\0'}; char str_offset[8] = {'\0'};
if (kv.offset) if (kv.offset)
sprintf(str_offset, "+%u", kv.offset); sprintf(str_offset, "+%u", kv.offset);
char str_dbgtag[4] = {'\0'}; char str_dbgtag[4] = {'\0'};
if (kv.dbgtag) if (kv.dbgtag)
sprintf(str_dbgtag, "-%c", kv.dbgtag); sprintf(str_dbgtag, "-%c", kv.dbgtag);
char str_cmtid[16] = {'\0'}; char str_cmtid[16] = {'\0'};
if (kv.cmtid) if (kv.cmtid)
sprintf(str_cmtid, " (%08x)", kv.cmtid); sprintf(str_cmtid, " (%08x)", kv.cmtid);
sprintf(str, fmt, kv.osrel[0], kv.osrel[1], kv.osrel[2], kv.osrel[3], sprintf(str, fmt, kv.osrel[0], kv.osrel[1], kv.osrel[2], kv.osrel[3],
str_offset, str_dbgtag, str_cmtid, kv.abimaj, kv.abimin); str_offset, str_dbgtag, str_cmtid, kv.abimaj, kv.abimin);
} }
void get_str_cpu_info(char *str) { // Retrieves the CPU Brand String and writes it to the provided buffer.
unsigned a, b, c, d; // out_buffer: A buffer of at least 49 bytes (48 for string + 1 for null)
void get_cpu_brand_string(char *out_buffer) {
asm ("cpuid" : if (!out_buffer) return;
"=a" (a),
"=b" (b), uint32_t regs[4];
"=c" (c),
"=d" (d): // 1. Check maximum extended function support
"a"(0)); __asm__ (
"cpuid"
str[0] = (b&0x000000ff) >> 0; : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
str[1] = (b&0x0000ff00) >> 8; : "a" (0x80000000)
str[2] = (b&0x00ff0000) >> 16; );
str[3] = (b&0xff000000) >> 24;
if (regs[0] < 0x80000004) {
str[4] = (d&0x000000ff) >> 0; strcpy(out_buffer, "Brand String Not Supported");
str[5] = (d&0x0000ff00) >> 8; return;
str[6] = (d&0x00ff0000) >> 16; }
str[7] = (d&0xff000000) >> 24;
// 2. Extract brand string from leaves 0x80000002 to 0x80000004
str[8] = (c&0x000000ff) >> 0; for (uint32_t leaf = 0x80000002; leaf <= 0x80000004; leaf++) {
str[9] = (c&0x0000ff00) >> 8; __asm__ (
str[10] = (c&0x00ff0000) >> 16; "cpuid"
str[11] = (c&0xff000000) >> 24; : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3])
str[12] = '\0'; : "a" (leaf)
} );
int cmd_ver(char param[]) { // Copy the 16 bytes (4 registers * 4 bytes) from this leaf into the buffer
if (!strcmp(param, "kernel")) { memcpy(out_buffer + (leaf - 0x80000002) * 16, regs, 16);
get_str_kernel_version(tmpstr, CMD_VER_FMT1); }
printf(tmpstr);
return TRUE; out_buffer[48] = '\0';
} }
if (!strcmp(param, "cpu")) { int cmd_ver(char param[]) {
char str[13]; if (!strcmp(param, "kernel")) {
get_str_cpu_info(str); get_str_kernel_version(tmpstr, CMD_VER_FMT1);
printf("%s\n\r", str); printf(tmpstr);
return TRUE; return TRUE;
} }
printf (" Shell v%s\n\r", SHELL_VERSION); if (!strcmp(param, "cpu")) {
return TRUE; char str[49];
} get_cpu_brand_string(str);
printf("%s\n\r", str);
return TRUE;
}
printf (" Shell v%s\n\r", SHELL_VERSION);
return TRUE;
}

View File

@@ -1,170 +1,170 @@
#include "all.h" #include "all.h"
int dir_check(char dir[]) int dir_check(char dir[])
/// just checks, if dir[] is really a directory /// just checks, if dir[] is really a directory
{ {
kol_struct70 k70; kol_struct70 k70;
int result; int result;
k70.p00 = 1; k70.p00 = 1;
k70.p04 = 0; k70.p04 = 0;
//k70.p08 = 0; //k70.p08 = 0;
k70.p12 = 2; // enough to read . & .. k70.p12 = 2; // enough to read . & ..
k70.p16 = (unsigned)malloc(32+k70.p12*560); k70.p16 = (unsigned)malloc(32+k70.p12*560);
k70.p20 = 0; k70.p20 = 0;
k70.p21 = dir; k70.p21 = dir;
result = kol_file_70(&k70); result = kol_file_70(&k70);
free((void*)k70.p16); free((void*)k70.p16);
if ( (0 == result)||(6 == result) ) // 6 is possible ??? if ( (0 == result)||(6 == result) ) // 6 is possible ???
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
} }
void dir_truncate(char dir[]) void dir_truncate(char dir[])
{ {
int i; int i;
i = strlen(dir)-1; i = strlen(dir)-1;
for (;;i--) for (;;i--)
if ('/' == dir[i]) if ('/' == dir[i])
{ {
dir[i+1] = 0; dir[i+1] = 0;
break; break;
} }
} }
void get_file_dir_loc(char *filepath, char *dir_path) void get_file_dir_loc(char *filepath, char *dir_path)
{ {
char *res = strrchr(filepath, '/'); char *res = strrchr(filepath, '/');
if (res == 0) if (res == 0)
{ {
dir_path = '\0'; dir_path = '\0';
return; return;
} }
size_t pos = res - filepath; size_t pos = res - filepath;
strncpy(dir_path, filepath, pos); strncpy(dir_path, filepath, pos);
dir_path[pos] = '\0'; dir_path[pos] = '\0';
} }
int file_check(char file[]) int file_check(char file[])
{ {
kol_struct70 k70; kol_struct70 k70;
int result; int result;
k70.p00 = 0; k70.p00 = 0;
k70.p04 = 0; k70.p04 = 0;
//k70.p08 = 0; //k70.p08 = 0;
k70.p12 = 0; k70.p12 = 0;
k70.p16 = 0; k70.p16 = 0;
k70.p20 = 0; k70.p20 = 0;
k70.p21 = file; k70.p21 = file;
result = kol_file_70(&k70); result = kol_file_70(&k70);
if (0 == result) if (0 == result)
return TRUE; return TRUE;
else else
return FALSE; return FALSE;
} }
void file_not_found(char file[]) { void file_not_found(char file[]) {
printf (FILE_NOT_FOUND_ERROR, file); printf (FILE_NOT_FOUND_ERROR, file);
} }
int iswhite(char c) {return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c)); } int iswhite(char c) {return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c)); }
void trim(char string[]) void trim(char string[])
{ {
int i, j; int i, j;
for (i=0; ;i++) for (i=0; ;i++)
if ( !iswhite(string[i]) ) if ( !iswhite(string[i]) )
break; break;
j = 0; j = 0;
for (;;i++, j++) for (;;i++, j++)
{ {
string[j] = string[i]; string[j] = string[i];
if ('\0' == string[i] ) if ('\0' == string[i] )
break; break;
} }
for (i=0; ;i++) for (i=0; ;i++)
if ('\0' == string[i]) if ('\0' == string[i])
break; break;
i--; i--;
for (;i>0;--i) for (;i>0;--i)
if ( iswhite(string[i]) ) if ( iswhite(string[i]) )
string[i] = '\0'; string[i] = '\0';
else else
break; break;
} }
// entry point // entry point
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int i; for (i = 1; i < argc; i++) { int i; for (i = 1; i < argc; i++) {
strcat(cmdline, argv[i]); strcat(cmdline, argv[i]);
if (i != argc - 1) { if (i != argc - 1) {
strcat(cmdline, " "); strcat(cmdline, " ");
} }
} }
NUM_OF_CMD = sizeof(COMMANDS)/sizeof(COMMANDS[0]); NUM_OF_CMD = sizeof(COMMANDS)/sizeof(COMMANDS[0]);
strcpy(title, "SHELL "); strcpy(title, "SHELL ");
strcat(title, SHELL_VERSION); strcat(title, SHELL_VERSION);
con_init_opt(-1, -1, -1, -1, title); con_init_opt(-1, -1, -1, -1, title);
//printf("argc = %d\ncmdline = '%s'\n", argc, cmdline); //printf("argc = %d\ncmdline = '%s'\n", argc, cmdline);
if (sizeof (kol_struct70) != 25) { if (sizeof (kol_struct70) != 25) {
printf("Invalid struct align kol_struct70, need to fix compile options\n\r"); printf("Invalid struct align kol_struct70, need to fix compile options\n\r");
kol_exit(); kol_exit();
} }
//strcpy(cur_dir, PATH); //strcpy(cur_dir, PATH);
//dir_truncate(cur_dir); //dir_truncate(cur_dir);
getcwd(cur_dir, sizeof cur_dir); getcwd(cur_dir, sizeof cur_dir);
//printf("curdir %s\n", cur_dir); //printf("curdir %s\n", cur_dir);
con_set_cursor_height(con_get_font_height()-1); con_set_cursor_height(con_get_font_height()-1);
ALIASES = malloc(128*1024); ALIASES = malloc(128*1024);
if (!cmdline || cmdline[0] == 0) { if (!cmdline || cmdline[0] == 0) {
strcpy(CMD, argv[0]); strcpy(CMD, argv[0]);
dir_truncate(CMD); dir_truncate(CMD);
strcat(CMD, ".shell"); strcat(CMD, ".shell");
if ( !file_check(CMD) ) if ( !file_check(CMD) )
strcpy(CMD, "/sys/settings/.shell"); strcpy(CMD, "/sys/settings/.shell");
} }
else { else {
if (cmdline[0] == '/') if (cmdline[0] == '/')
{ {
strcpy(cur_dir, cmdline); strcpy(cur_dir, cmdline);
*(strrchr(cur_dir, '/')+1)=0; *(strrchr(cur_dir, '/')+1)=0;
} }
strcpy(CMD, cmdline); strcpy(CMD, cmdline);
} }
command_execute(); command_execute();
for (;;) { for (;;) {
//printf("\033[32;1m"); //printf("\033[32;1m");
printf ("# "); printf ("# ");
//printf("\033[0m"); //printf("\033[0m");
command_get(); command_get();
command_execute(); command_execute();
} }
con_exit(0); con_exit(0);
kol_exit(); kol_exit();
} }