From caf4f7a0550f37f23c10bc2f43f0809e9fc5fbc1 Mon Sep 17 00:00:00 2001 From: Karina Date: Sun, 28 Dec 2025 01:47:17 +0400 Subject: [PATCH] feat: basic ksh --- .gitignore | 2 +- kernel/CMakeLists.txt | 1 - kernel/inc/core/string.h | 10 +++++++ kernel/inc/drivers/console.h | 1 + kernel/inc/shell/ksh.h | 8 ++++++ kernel/src/core/string.c | 12 ++++++++ kernel/src/drivers/console.c | 4 +++ kernel/src/kmain.c | 14 ++++----- kernel/src/shell/ksh.c | 55 ++++++++++++++++++++++++++++++++++++ 9 files changed, 97 insertions(+), 10 deletions(-) create mode 100644 kernel/inc/core/string.h create mode 100644 kernel/inc/shell/ksh.h create mode 100644 kernel/src/core/string.c diff --git a/.gitignore b/.gitignore index 790dacc..fa6e4a8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .cache -build +build* .venv \ No newline at end of file diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index af2a337..41464a5 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -51,7 +51,6 @@ target_link_options(kernel PRIVATE -static -no-pie -T "${CMAKE_CURRENT_SOURCE_DIR}/linker.ld" - -Wl,-Map,"${CMAKE_BINARY_DIR}/kernel.map" -z max-page-size=0x1000 ) diff --git a/kernel/inc/core/string.h b/kernel/inc/core/string.h new file mode 100644 index 0000000..f4b0212 --- /dev/null +++ b/kernel/inc/core/string.h @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash + +#ifndef STRING_H +#define STRING_H +#include + +i32 strcmp(const char* s1, const char* s2); + +#endif \ No newline at end of file diff --git a/kernel/inc/drivers/console.h b/kernel/inc/drivers/console.h index c34ba00..3a9f40d 100644 --- a/kernel/inc/drivers/console.h +++ b/kernel/inc/drivers/console.h @@ -7,6 +7,7 @@ #include void console_init(SG_Context *ctx); +u64 console_get_colors(); void console_clear(u32 color); SG_Context* console_get_context(); SG_Point console_get_dimensions(); diff --git a/kernel/inc/shell/ksh.h b/kernel/inc/shell/ksh.h new file mode 100644 index 0000000..e95eef4 --- /dev/null +++ b/kernel/inc/shell/ksh.h @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash +#ifndef KSH_H +#define KSH_H + +void ksh(); + +#endif \ No newline at end of file diff --git a/kernel/src/core/string.c b/kernel/src/core/string.c new file mode 100644 index 0000000..7cba331 --- /dev/null +++ b/kernel/src/core/string.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash + +#include + +i32 strcmp(const char* s1, const char* s2) { + while (*s1 && (*s1 == *s2)) { + s1++; + s2++; + } + return *(const unsigned char*)s1 - *(const unsigned char*)s2; +} \ No newline at end of file diff --git a/kernel/src/drivers/console.c b/kernel/src/drivers/console.c index 8e8de33..ca89b30 100644 --- a/kernel/src/drivers/console.c +++ b/kernel/src/drivers/console.c @@ -43,6 +43,10 @@ void console_init(SG_Context *ctx) { s_font.base = (const unsigned char*)font8x16; } +u64 console_get_colors() { + return ((u64) s_color << 32) | s_bg_color; +} + void console_clear(u32 color) { if (!ctx_ptr) return; diff --git a/kernel/src/kmain.c b/kernel/src/kmain.c index c3dd911..3e77145 100644 --- a/kernel/src/kmain.c +++ b/kernel/src/kmain.c @@ -3,6 +3,7 @@ #include "bootinfo.h" #include "../data/logo.h" +#include "shell/ksh.h" #include @@ -10,6 +11,8 @@ #include #include +#include + #include #include #include @@ -49,12 +52,7 @@ void kmain(Bootinfo* info) { SG_Point text_normal_point = {0, 120}; // not nice to hardcode nums like that but we have what we have console_set_cursor_pos(&text_normal_point); - kprintf("ksh_> "); - char buff[32]; - kgets(buff, 32); - kprintf("You typed: %s", buff); - - __asm__ volatile ("sti"); - - while (1) { __asm__("hlt"); } + ksh(); + + panic("Kernel main loop exited"); } \ No newline at end of file diff --git a/kernel/src/shell/ksh.c b/kernel/src/shell/ksh.c index 0fcf39f..1d0d029 100644 --- a/kernel/src/shell/ksh.c +++ b/kernel/src/shell/ksh.c @@ -1,3 +1,58 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (c) 2025 0xKarinyash +#include +#include +#include +typedef enum { + TOKEN_NULL, + TOKEN_ILLEGAL, + + TOKEN_HELP, + + TOKEN_QUIT, + TOKEN_CLEAR +} ksh_token; + +typedef struct { + char* str; + ksh_token token; +} ksh_command_map; + +static const ksh_command_map token_map[] = { + {"q", TOKEN_QUIT}, + {"quit", TOKEN_QUIT}, + {"exit", TOKEN_QUIT}, + + {"cls", TOKEN_CLEAR}, + {"clear", TOKEN_CLEAR}, + + {"help", TOKEN_HELP}, + {nullptr, TOKEN_NULL} +}; + +ksh_token char2token(char* token) { + for (i32 i = 0; token_map[i].str != nullptr; i++) { + if (strcmp(token, token_map[i].str) == 0) return token_map[i].token; + } + return TOKEN_ILLEGAL; +} + +static void print_help() { + kprintf("\tWelcome to ^ptermOS^0's kernel shell!\n"); + kprintf("\tIt can almost nothing! yet."); +} + +void ksh() { + while (true) { + kprintf("\nksh_> "); + char cmdbuff[256]; + kgets(cmdbuff, 256); + switch(char2token(cmdbuff)) { + case TOKEN_QUIT: return; // that'll cause panic lol + case TOKEN_CLEAR: console_clear((u32) console_get_colors() & 0xFFFFFFFF); break; + case TOKEN_HELP: print_help(); break; + default: kprintf("Unknown command!!"); break; + } + } +} \ No newline at end of file