Espresso 0.0.2a
This commit is contained in:
287
kernel/kshell.c
Normal file
287
kernel/kshell.c
Normal file
@ -0,0 +1,287 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <drivers/ps2_keyboard.h>
|
||||
#include <tty.h>
|
||||
#include <kernel/ksh_debug.h>
|
||||
|
||||
#include <kernel/kshell.h>
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user