#include #include #include #include #include #include #include const char* shell_version = "0.0.2"; char* prompt = NULL; int command = -1; bool _debug = false; int execute(void); static void print_intro(void) { printf("Espresso kshell, ver %s on Espresso %s", shell_version, KERNEL_VERSION); #ifdef _DEBUG printf(" DEBUG BUILD"); #endif printf("\nSSE level: "); command = 0; execute(); extern char* get_cpu_vendor_string(void); extern char* get_cpu_brand_string(void); char* temp_ = get_cpu_vendor_string(); char* _temp = get_cpu_brand_string(); printf("CPU: %s\n", _temp == NULL ? "No info" : _temp); printf("CPU vendor: %s\n", temp_ == NULL ? "No info" : temp_); if (temp_) { free(temp_); } if (_temp) { free(_temp); } printf("\nCopyright 2025 David J Goeke\n"); } static void parse_opts(int argc, char** argv) { for (int i = 0; i < argc; i++) { if (strcmp(argv[i], "--color") == 0) { } } } int kshell_start(int argc, char** argv) { (void)argc; (void)argv; prompt = strdup(">"); char* i = NULL; terminal_setcolor(VGA_COLOR_LIGHT_BLUE); print_intro(); command = -1; do { printf("%s ", prompt); i = gets(); command = -1; if (strcmp(i, "") == 0) { continue; } else if (strcmp(i, "exit") == 0 || strcmp(i, "quit") == 0) { break; } else if (strcmp(i, "sseinfo") == 0) { command = 0; } else if (strcmp(i, "kinfo") == 0) { command = 1; } else if (strcmp(i, "enable_debug") == 0) { _debug = true; } else if (strcmp(i, "disable_debug") == 0) { _debug = false; } else if (strcmp(i, "toggle_debug") == 0) { _debug = !_debug; } else if (strcmp(i, "get_debug") == 0) { printf("Debugging: %s\n", _debug == true ? "On" : "Off"); } else if (strcmp(i, "dumpregs") == 0) { command = 2; } else if (strcmp(i, "dumpgprs") == 0) { command = 3; } else if (strcmp(i, "kernelmem") == 0) { command = 4; } else if (strcmp(i, "sectionmem") == 0) { command = 5; } else if (strcmp(i, "testascii") == 0) { command = 6; } else if (strcmp(i, "asciitype") == 0) { command = 7; } else { printf("Unknown command %s len %i\n", i, strlen(i)); } if (_debug) { printf(" ASCII -> "); size_t len = strlen(i) + 1; for (size_t n = 0; n < len; n++) { printf("%02X ", (int) i[n]); } printf("\n"); } execute(); } while (1); free(i); printf("Goodbye\n"); return 0; } int execute(void) { switch (command) { case 0: { extern int sse_initialized; switch (sse_initialized) { case 0: printf("No SSE support"); break; case 1: printf("SSE1"); break; case 2: printf("SSE2"); break; case 3: printf("SSE3"); break; case 4: printf("SSSE3"); break; case 5: printf("SSE4.1"); break; case 6: printf("SSE4.2"); break; default: printf("WARNING: sse_initialized is in a invalid state!"); break; } printf("\n"); break; } case 1: { printf("Espresso %s\n", KERNEL_VERSION); break; } case 2: { print_all_regs(); break; } case 3: { print_gprs(); break; } case 4: { extern uint8_t __kernel_start; extern uint8_t __kernel_end; size_t kernel_size = (size_t)&__kernel_end - (size_t)&__kernel_start; printf("Kernel start: 0x%x\n", (&__kernel_start)); printf("Kernel end: 0x%x\n", (&__kernel_end)); printf("Kernel size (bytes): %llu\n", (uint64_t) kernel_size); printf("Kernel size (kbytes): %llu\n", (((uint64_t) kernel_size) / 1000)); printf("Kernel size (mbytes): %f\n", (((uint64_t) kernel_size) / 1000.0) / 1000.0); break; } case 5: { extern uint8_t __kernel_text_start; extern uint8_t __kernel_text_end; extern uint8_t __kernel_rodata_start; extern uint8_t __kernel_rodata_end; extern uint8_t __kernel_data_start; extern uint8_t __kernel_data_end; extern uint8_t __bss_start; extern uint8_t __bss_end; printf(".text: %i\n.data: %i\n.rodata: %i\n.bss: %i\n", ((&__kernel_text_end) - (&__kernel_text_start)), ((&__kernel_data_end) - (&__kernel_data_start)), ((&__kernel_rodata_end) - (&__kernel_rodata_start)), ((&__bss_end) - (&__bss_start))); break; } case 6: { /*extern void terminal_clear(void);*/ terminal_clear(); printf("Printing ASCII chars 0x00 through 0xFE, hit enter to exit\n"); sleep(2500); terminal_clear(); for (int i = 0x00; i < 0xFF; i++) { printf("%c", (char) i); } printf("\nCool ASCII art\n%c%c\n%c%c\n", 0xDA, 0xBF, 0xC0, 0xD9); gets(); break; } case 7: { break; } } return 0; }