From 894c513609065b346b852c1eb50c243cd5a41927 Mon Sep 17 00:00:00 2001 From: Karina Date: Sun, 28 Dec 2025 07:36:04 +0400 Subject: [PATCH] minor refactor; cats in ksh --- kernel/data/cats.h | 40 ++++++++++++++++++ kernel/inc/core/splash.h | 8 ++++ kernel/inc/drivers/console.h | 1 + kernel/inc/shell/builtins.h | 13 ++++++ kernel/inc/shell/kfetch.h | 9 ----- kernel/inc/shell/ksh.h | 4 +- kernel/src/arch/x86_64/interrupts.c | 4 ++ kernel/src/core/panic.c | 45 +++++++++++---------- kernel/src/core/splash.c | 16 ++++++++ kernel/src/drivers/console.c | 7 ++++ kernel/src/kmain.c | 27 +++++-------- kernel/src/shell/builtins.c | 63 +++++++++++++++++++++++++++++ kernel/src/shell/kfetch.c | 35 ---------------- kernel/src/shell/ksh.c | 34 +++++++++++----- 14 files changed, 211 insertions(+), 95 deletions(-) create mode 100644 kernel/data/cats.h create mode 100644 kernel/inc/core/splash.h create mode 100644 kernel/inc/shell/builtins.h delete mode 100644 kernel/inc/shell/kfetch.h create mode 100644 kernel/src/core/splash.c create mode 100644 kernel/src/shell/builtins.c delete mode 100644 kernel/src/shell/kfetch.c diff --git a/kernel/data/cats.h b/kernel/data/cats.h new file mode 100644 index 0000000..3dfe310 --- /dev/null +++ b/kernel/data/cats.h @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash +// cats licensed to their authors +// i took it from https://www.asciiart.eu/animals/cats + +#pragma once + +const char *cats[] = { + " _\n" + " | \\\n" + " | |\n" + " | |\n" + " |\\ | |\n" + " /, ~\\ / /\n" + "X `-.....-------./ /\n" + " ~-. ~ ~ |\n" + " \\ / |\n" + " \\ /_ ___\\ /\n" + " | /\\ ~~~~~ \\ |\n" + " | | \\ || |\n" + " | |\\ \\ || )\n" + " (_/ (_/ ((_/\n", + + " _._ _,-'\"\"`-._\n" + "(,-.`._,'( |\\`-/|\n" + " `-.-' \\ )-`( , o o)\n" + " `- \\`_`\"'-\n", + + " /\\_/\\\n" + "( o.o )\n" + " > ^ <\n", + + " /\\_____/\\\n" + " / o o \\\n" + " ( == ^ == )\n" + " ) (\n" + " ( )\n" + " ( ( ) ( ) )\n" + "(___(__)___(__)__)\n" +}; \ No newline at end of file diff --git a/kernel/inc/core/splash.h b/kernel/inc/core/splash.h new file mode 100644 index 0000000..42bb8f4 --- /dev/null +++ b/kernel/inc/core/splash.h @@ -0,0 +1,8 @@ +#ifndef SPLASH_H +#define SPLASH_H + +#include + +void show_splash(SG_Context *sg_ctx); + +#endif \ No newline at end of file diff --git a/kernel/inc/drivers/console.h b/kernel/inc/drivers/console.h index 3a9f40d..5eb948b 100644 --- a/kernel/inc/drivers/console.h +++ b/kernel/inc/drivers/console.h @@ -12,6 +12,7 @@ void console_clear(u32 color); SG_Context* console_get_context(); SG_Point console_get_dimensions(); void console_set_color(u32 color); +void console_set_default_color(u32 color); void console_set_cursor_pos(SG_Point *p); void kprint(const char *str); void kprintf(const char *fmt, ...); diff --git a/kernel/inc/shell/builtins.h b/kernel/inc/shell/builtins.h new file mode 100644 index 0000000..c96274b --- /dev/null +++ b/kernel/inc/shell/builtins.h @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash + +#ifndef SHELLBUILTINS_H +#define SHELLBUILTINS_H + +void cmd_kfetch(); +void cmd_meow(); +void cmd_help(); +void cmd_regs(); +void print_regs(); + +#endif \ No newline at end of file diff --git a/kernel/inc/shell/kfetch.h b/kernel/inc/shell/kfetch.h deleted file mode 100644 index 5243300..0000000 --- a/kernel/inc/shell/kfetch.h +++ /dev/null @@ -1,9 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -// Copyright (c) 2025 0xKarinyash - -#ifndef KFETCH_H -#define KFETCH_H - -void kfetch(); - -#endif \ No newline at end of file diff --git a/kernel/inc/shell/ksh.h b/kernel/inc/shell/ksh.h index e95eef4..063c549 100644 --- a/kernel/inc/shell/ksh.h +++ b/kernel/inc/shell/ksh.h @@ -3,6 +3,8 @@ #ifndef KSH_H #define KSH_H -void ksh(); +#include + +void ksh(SG_Context* sg_ctx); #endif \ No newline at end of file diff --git a/kernel/src/arch/x86_64/interrupts.c b/kernel/src/arch/x86_64/interrupts.c index ab8b547..65797fe 100644 --- a/kernel/src/arch/x86_64/interrupts.c +++ b/kernel/src/arch/x86_64/interrupts.c @@ -4,10 +4,14 @@ #include #include #include +#include #include void isr_handler_c(Registers *regs) { + if (regs->int_no == 3) { + return print_regs(); + } panic_exception(regs); } diff --git a/kernel/src/core/panic.c b/kernel/src/core/panic.c index ffba314..c761f4b 100644 --- a/kernel/src/core/panic.c +++ b/kernel/src/core/panic.c @@ -97,8 +97,9 @@ __attribute__((noreturn)) void die() { } void draw_panic_bg() { - console_clear(0x101010); + console_clear(0x000000); console_set_color(0xFFFFFF); + console_set_default_color(0xFFFFFF); SG_Point p = console_get_dimensions(); p.x /= 2; @@ -111,39 +112,39 @@ void draw_panic_bg() { u8 rand_num = shitrand() % msg_count; kprintf("\n\n"); - kprintf("\t\t\t\t^tKERNEL PANIC^w :( \n"); + kprintf("\t\t\t\t^tKERNEL PANIC^! :( \n"); kprintf("\t\t--------------------------------\n"); - kprintf("\t\t\t\t^r%s^w\n", fun_messages[rand_num]); + kprintf("\t\t\t\t^r%s^!\n", fun_messages[rand_num]); kprintf("\t\t--------------------------------\n"); } __attribute__((noreturn)) void panic_exception(Registers *regs) { draw_panic_bg(); - kprintf("\t\t^yCPU EXCEPTION^w: ^m%s^w (%d)\n", exception_messages[regs->int_no], regs->int_no); - if (regs->err_code) kprintf("\t\t^yError Code^w: %X\n", regs->err_code); - kprintf("\t\t^yInstruction Pointer^w (^yRIP^w): %X\n", regs->rip); - kprintf("\t\t^yCode Segment^w (^yCS^w): %X\n", regs->cs); - kprintf("\t\t^yFlags^w (^yRFLAGS^w): %X\n", regs->rflags); - kprintf("\t\t^yStack Pointer^w (^yRSP^w): %X\n", regs->rsp); + kprintf("\t\t^yCPU EXCEPTION^!: ^m%s^! (%d)\n", exception_messages[regs->int_no], regs->int_no); + if (regs->err_code) kprintf("\t\t^yError Code^!: %X\n", regs->err_code); + kprintf("\t\t^yInstruction Pointer^! (^yRIP^!): %X\n", regs->rip); + kprintf("\t\t^yCode Segment^! (^yCS^!): %X\n", regs->cs); + kprintf("\t\t^yFlags^! (^yRFLAGS^!): %X\n", regs->rflags); + kprintf("\t\t^yStack Pointer^! (^yRSP^!): %X\n", regs->rsp); if (regs->int_no == 14) { u64 cr2; __asm__ volatile("mov %%cr2, %0" : "=r"(cr2)); - kprintf("\t\t^yFaulting Address^w (^yCR2^w): %X\n", cr2); + kprintf("\t\t^yFaulting Address^! (^yCR2^!): %X\n", cr2); } kprintf("\t\t--------------------------------\n"); - kprintf("\t\t\t\t^yREGSISTERS^w\n"); + kprintf("\t\t\t\t^yREGSISTERS^!\n"); kprintf("\t\t--------------------------------\n"); - kprintf("\t\t^yRAX^w=%X, ^yRBX^w=%X\n", regs->rax, regs->rbx); - kprintf("\t\t^yRCX^w=%X, ^yRDX^w=%X\n", regs->rcx, regs->rdx); - kprintf("\t\t^yRSI^w=%X, ^yRDI^w=%X\n", regs->rsi, regs->rdi); - kprintf("\t\t^yRBP^w=%X, ^yR8^w =%X\n", regs->rbp, regs->r8); - kprintf("\t\t^yR9^w =%X, ^yR10^w=%X \n", regs->r9, regs->r10); - kprintf("\t\t^yR11^w=%X, ^yR12^w=%X\n", regs->r11, regs->r12); - kprintf("\t\t^yR13^w=%X, ^yR14^w=%X\n", regs->r13, regs->r14); - kprintf("\t\t^yR15^w=%X\n",regs->r15); + kprintf("\t\t^yRAX^!=%X, ^yRBX^!=%X\n", regs->rax, regs->rbx); + kprintf("\t\t^yRCX^!=%X, ^yRDX^!=%X\n", regs->rcx, regs->rdx); + kprintf("\t\t^yRSI^!=%X, ^yRDI^!=%X\n", regs->rsi, regs->rdi); + kprintf("\t\t^yRBP^!=%X, ^yR8^! =%X\n", regs->rbp, regs->r8); + kprintf("\t\t^yR9^! =%X, ^yR10^!=%X \n", regs->r9, regs->r10); + kprintf("\t\t^yR11^!=%X, ^yR12^!=%X\n", regs->r11, regs->r12); + kprintf("\t\t^yR13^!=%X, ^yR14^!=%X\n", regs->r13, regs->r14); + kprintf("\t\t^yR15^!=%X\n",regs->r15); kprintf("\t\t--------------------------------\n"); - kprintf("\t\t\t\t^tSystem halted.^w\n"); + kprintf("\t\t\t\t^tSystem halted.^!\n"); die(); } @@ -151,9 +152,9 @@ __attribute__((noreturn)) void panic_exception(Registers *regs) { __attribute__((noreturn)) void panic(const char* msg) { draw_panic_bg(); - kprintf("\t\t^yReason^w: %s\n", msg); + kprintf("\t\t^yReason^!: %s\n", msg); kprintf("\t\t--------------------------------\n"); - kprintf("\t\t\t\t^tSystem halted.^w\n"); + kprintf("\t\t\t\t^tSystem halted.^!\n"); die(); } \ No newline at end of file diff --git a/kernel/src/core/splash.c b/kernel/src/core/splash.c new file mode 100644 index 0000000..c528073 --- /dev/null +++ b/kernel/src/core/splash.c @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash +#include +#include +#include "../data/logo.h" + +void show_splash(SG_Context *sg_ctx) { + SG_Point logo_point = {0, 10}; + sg_put_img(sg_ctx, &logo_point, &logo_img); + SG_Point start_pos = {75, 55}; // greeting + console_set_cursor_pos(&start_pos); + kprintf("Welcome to ^ptermOS^!!!!\n"); + + 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); +} diff --git a/kernel/src/drivers/console.c b/kernel/src/drivers/console.c index ca89b30..651c7bd 100644 --- a/kernel/src/drivers/console.c +++ b/kernel/src/drivers/console.c @@ -31,6 +31,7 @@ static SG_Context *ctx_ptr = nullptr; static SG_Point s_cursor_pos = {0}; static SG_Font s_font = {0}; static u32 s_color = COLOR_WHITE; +static u32 s_def_color = COLOR_WHITE; static u32 s_bg_color = COLOR_BLACK; void console_init(SG_Context *ctx) { @@ -205,6 +206,8 @@ void kprintf(const char *fmt, ...) { case 'p': console_set_color(COLOR_PINK); break; case '0': console_set_color(COLOR_BLACK); break; case 'w': console_set_color(COLOR_WHITE); break; + case '!': console_set_color(s_def_color); break; + case '~': console_set_color(~s_bg_color); break; case '^': console_putc('^'); break; default: { console_putc('^'); @@ -224,6 +227,10 @@ void console_set_color(u32 color) { s_color = color; } +void console_set_default_color(u32 color) { + s_def_color = color; +} + static char console_getc() { while (kb_buf.head == kb_buf.tail) __asm__ volatile ("sti; hlt"); __asm__ volatile ("cli"); diff --git a/kernel/src/kmain.c b/kernel/src/kmain.c index 84e7b2f..adfcc8e 100644 --- a/kernel/src/kmain.c +++ b/kernel/src/kmain.c @@ -2,8 +2,7 @@ // Copyright (c) 2025 0xKarinyash #include "bootinfo.h" -#include "../data/logo.h" -#include "shell/ksh.h" +#include #include @@ -12,6 +11,7 @@ #include #include +#include #include #include @@ -19,19 +19,11 @@ #include #include +#define FG_COLOR 0xffffff +#define BG_COLOR 0x111111 + extern u64 _kernel_end; -void greet(SG_Context *sg_ctx) { - SG_Point logo_point = {0, 10}; - sg_put_img(sg_ctx, &logo_point, &logo_img); - SG_Point start_pos = {75, 55}; // greeting - console_set_cursor_pos(&start_pos); - kprintf("Welcome to ^ptermOS^0!!!\n"); - - 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); -} - void kmain(Bootinfo* info) { u32 *fb = (u32*)info->framebuffer.base; if (!fb) return; @@ -44,8 +36,9 @@ void kmain(Bootinfo* info) { serial_init(); console_init(&sg_ctx); - console_clear(0xFFFFFF); - console_set_color(0x000000); + console_clear(BG_COLOR); + console_set_color(FG_COLOR); + console_set_default_color(FG_COLOR); gdt_init(); idt_init(); @@ -53,9 +46,9 @@ void kmain(Bootinfo* info) { pmm_init(info->mem); vmm_init(info); - greet(&sg_ctx); + show_splash(&sg_ctx); - ksh(); + ksh(&sg_ctx); panic("Kernel main loop exited"); } \ No newline at end of file diff --git a/kernel/src/shell/builtins.c b/kernel/src/shell/builtins.c new file mode 100644 index 0000000..75ec828 --- /dev/null +++ b/kernel/src/shell/builtins.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash + +#include +#include + +#include "../data/cats.h" +#include "types.h" + +const char* ascii_logo[] = { + " /\\___/\\ ", + " | > < | ", + " | w | ", + " |=======|__ ", + " | | | ", + " |TERMOS | | ", + " | |__| ", + " |_______| " +}; + + +void cmd_kfetch() { + kprintf("\n\n"); + kprintf("^p %s ^0\t\t^g kernel^0@^gtermos\n^0", ascii_logo[0]); + kprintf("^p %s ^0\t\t^0-------------\n^0", ascii_logo[1]); + kprintf("^p %s ^0\t\t^gOS^0: termOS 0.0.1\n^0", ascii_logo[2]); + kprintf("^p %s ^0\t\t^gKernel^0: sucks\n^0", ascii_logo[3]); + kprintf("^p %s ^0\t\t^gUptime^0: 0h 0m\n^0", ascii_logo[4]); + kprintf("^p %s ^0\t\t^gShell^0: termosh\n^0", ascii_logo[5]); + kprintf("^p %s ^p\t\t^gDE^0: shitgui\n^0", ascii_logo[6]); + kprintf("^p %s ^p\t\t^gCPU^0: %s\n^0", ascii_logo[7], "cool one"); + kprintf("\n\n"); +} + +void cmd_meow() { + u64 cats_count = sizeof(cats) / sizeof(cats[0]); + u8 rand_num = shitrand() % cats_count; + kprintf("Nyaaa!!\n\n%s\n\n", cats[rand_num]); +} + +void cmd_help() { + kprintf("\tWelcome to ^ptermOS^!'s kernel shell!\n"); + kprintf("\tIt can almost nothing! yet.\n"); +} + +void cmd_regs() { + __asm__ volatile ("int3"); +} + +void print_regs(Registers *regs) { + kprintf("--------------------------------\n"); + kprintf("\t\t^gREGISTERS^!\n"); + kprintf("--------------------------------\n"); + kprintf("^gRAX^!=%X, ^gRBX^!=%X\n", regs->rax, regs->rbx); + kprintf("^gRCX^!=%X, ^gRDX^!=%X\n", regs->rcx, regs->rdx); + kprintf("^gRSI^!=%X, ^gRDI^!=%X\n", regs->rsi, regs->rdi); + kprintf("^gRBP^!=%X, ^gR8^! =%X\n", regs->rbp, regs->r8); + kprintf("^gR9^! =%X, ^gR10^!=%X \n", regs->r9, regs->r10); + kprintf("^gR11^!=%X, ^gR12^!=%X\n", regs->r11, regs->r12); + kprintf("^gR13^!=%X, ^gR14^!=%X\n", regs->r13, regs->r14); + kprintf("^gR15^!=%X\n",regs->r15); + kprintf("--------------------------------\n"); +} diff --git a/kernel/src/shell/kfetch.c b/kernel/src/shell/kfetch.c deleted file mode 100644 index ae137cd..0000000 --- a/kernel/src/shell/kfetch.c +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0-or-later -// Copyright (c) 2025 0xKarinyash - -// yes. *fetch in kernel -// WHY FUCKING NOT?? its my OS, my rules - -#include - -const char* ascii_logo[] = { - " /\\___/\\ ", - " | > < | ", - " | w | ", - " |=======|__ ", - " | | | ", - " |TERMOS | | ", - " | |__| ", - " |_______| " -}; - - -void kfetch() { - char cpu_brand[49]; - //cpu_get_brand_string(cpu_brand); - - kprintf("\n\n"); - kprintf("^p %s ^0\t\t^g kernel^0@^gtermos\n^0", ascii_logo[0]); - kprintf("^p %s ^0\t\t^0-------------\n^0", ascii_logo[1]); - kprintf("^p %s ^0\t\t^gOS^0: termOS 0.0.1\n^0", ascii_logo[2]); - kprintf("^p %s ^0\t\t^gKernel^0: sucks\n^0", ascii_logo[3]); - kprintf("^p %s ^0\t\t^gUptime^0: 0h 0m\n^0", ascii_logo[4]); - kprintf("^p %s ^0\t\t^gShell^0: termosh\n^0", ascii_logo[5]); - kprintf("^p %s ^p\t\t^gDE^0: shitgui\n^0", ascii_logo[6]); - kprintf("^p %s ^p\t\t^gCPU^0: %s\n^0", ascii_logo[7], cpu_brand); - kprintf("\n\n"); -} \ No newline at end of file diff --git a/kernel/src/shell/ksh.c b/kernel/src/shell/ksh.c index fd16359..d0c4e10 100644 --- a/kernel/src/shell/ksh.c +++ b/kernel/src/shell/ksh.c @@ -1,10 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (c) 2025 0xKarinyash -#include "core/panic.h" + #include -#include +#include + #include +#include + #include +#include +#include +#include typedef enum { TOKEN_EMPTY, @@ -13,9 +19,12 @@ typedef enum { TOKEN_ILLEGAL, TOKEN_HELP, + TOKEN_SPLASH, TOKEN_KFETCH, + TOKEN_MEOW, + TOKEN_REGS, TOKEN_PANIC, TOKEN_PANIC_UD2, TOKEN_PANIC_PF, @@ -37,11 +46,15 @@ static const ksh_command_map token_map[] = { {"cls", TOKEN_CLEAR}, {"clear", TOKEN_CLEAR}, - + + {"meow", TOKEN_MEOW}, + {"nya", TOKEN_MEOW}, + {"splash", TOKEN_SPLASH}, {"kfetch", TOKEN_KFETCH}, {"fastfetch", TOKEN_KFETCH}, {"neofetch", TOKEN_KFETCH}, + {"regs", TOKEN_REGS}, {"panic", TOKEN_PANIC}, {"ud2", TOKEN_PANIC_UD2}, {"pf", TOKEN_PANIC_PF}, @@ -57,12 +70,7 @@ ksh_token char2token(char* token) { return TOKEN_ILLEGAL; } -static void print_help() { - kprintf("\tWelcome to ^ptermOS^0's kernel shell!\n"); - kprintf("\tIt can almost nothing! yet.\n"); -} - -void ksh() { +void ksh(SG_Context* sg_ctx) { while (true) { kprintf("ksh_> "); char cmdbuff[256]; @@ -71,13 +79,17 @@ void ksh() { case TOKEN_EMPTY: continue; case TOKEN_QUIT: return; // that'll cause panic lol + + case TOKEN_REGS: cmd_regs(); break; case TOKEN_PANIC: panic("Manually initiated panic"); case TOKEN_PANIC_UD2: __asm__ volatile ("ud2"); case TOKEN_PANIC_PF: u64* bad_ptr = (u64*)0xDEADBEEF; *bad_ptr = 666; + case TOKEN_SPLASH: show_splash(sg_ctx); break; case TOKEN_CLEAR: console_clear((u32) console_get_colors() & 0xFFFFFFFF); break; - case TOKEN_HELP: print_help(); break; - case TOKEN_KFETCH: kfetch(); break; + case TOKEN_HELP: cmd_help(); break; + case TOKEN_KFETCH: cmd_kfetch(); break; + case TOKEN_MEOW: cmd_meow(); break; default: kprintf("Unknown command!!\n"); break; }