From 6bfce3c8668ff9f25197f45d8b7839c0c1620568 Mon Sep 17 00:00:00 2001 From: Karina Date: Mon, 29 Dec 2025 06:24:58 +0400 Subject: [PATCH] wip: timer. sending to pc --- kernel/inc/drivers/timer.h | 13 ++++++++++ kernel/inc/shell/builtins.h | 1 + kernel/src/arch/x86_64/interrupts.c | 3 ++- kernel/src/drivers/timer.c | 38 +++++++++++++++++++++++++++++ kernel/src/kmain.c | 3 +++ kernel/src/shell/builtins.c | 15 +++++++++--- kernel/src/shell/ksh.c | 5 ++++ 7 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 kernel/inc/drivers/timer.h create mode 100644 kernel/src/drivers/timer.c diff --git a/kernel/inc/drivers/timer.h b/kernel/inc/drivers/timer.h new file mode 100644 index 0000000..b7260a4 --- /dev/null +++ b/kernel/inc/drivers/timer.h @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash +#ifndef TIMER_H +#define TIMER_H + +#include + +void timer_init(u32 freq); +void timer_handler(); +void sleep(u64 ms); +u64 get_uptime(); + +#endif \ No newline at end of file diff --git a/kernel/inc/shell/builtins.h b/kernel/inc/shell/builtins.h index 25948a8..2950f0b 100644 --- a/kernel/inc/shell/builtins.h +++ b/kernel/inc/shell/builtins.h @@ -9,6 +9,7 @@ void cmd_meow(); void cmd_help(); void cmd_regs(); void print_regs(); +void cmd_sleep(); int rectest(int a); #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 85d8bf8..3a2e65f 100644 --- a/kernel/src/arch/x86_64/interrupts.c +++ b/kernel/src/arch/x86_64/interrupts.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (c) 2025 0xKarinyash +#include "drivers/timer.h" #include #include #include @@ -17,7 +18,7 @@ void isr_handler_c(Registers *regs) { void irq_handler_c(Registers *regs) { switch (regs->int_no) { - case 32: return outb(MASTER_COMMAND, 0x20); + case 32: return timer_handler(); case 33: return kb_handler(); default: outb(SLAVE_COMMAND, 0x20); break; } diff --git a/kernel/src/drivers/timer.c b/kernel/src/drivers/timer.c new file mode 100644 index 0000000..0ce13c7 --- /dev/null +++ b/kernel/src/drivers/timer.c @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (c) 2025 0xKarinyash + +#include +#include +#include + +#define PIT_BASE_CLOCK 1193180 +#define PIT_CMD 0x43 +#define PIT_DATA 0x40 + +volatile u64 ticks = 0; + +void timer_init(u32 freq) { + u32 divisor = PIT_BASE_CLOCK / freq; + + outb(PIT_CMD, 0x36); // 0x36 = 00110110 = channel 0, LOHI byte access, Mode 3, binary + outb(PIT_DATA, divisor & 0xFF); + outb(PIT_DATA, (divisor >> 8) & 0xFF); + + u8 mask = inb(0x21); + mask &= ~(1 << 0); + outb(0x21, mask); +} + +void timer_handler() { + ticks++; + outb(MASTER_COMMAND, 0x20); +} + +void sleep(u64 ms) { + u64 start = ticks; + while (ticks < start + ms) __asm__ volatile ("hlt"); +} + +u64 get_uptime() { + return ticks; +} \ No newline at end of file diff --git a/kernel/src/kmain.c b/kernel/src/kmain.c index 451a30e..a6e9592 100644 --- a/kernel/src/kmain.c +++ b/kernel/src/kmain.c @@ -2,6 +2,7 @@ // Copyright (c) 2025 0xKarinyash #include "bootinfo.h" +#include "drivers/timer.h" #include #include @@ -39,6 +40,8 @@ void kmain(Bootinfo* info) { serial_write("PMM initialized\n"); vmm_init(info); serial_write("VMM initialized\n"); + timer_init(1000); + serial_write("Timer initialized\n"); info = (Bootinfo*)PHYS_TO_HHDM((u64)info); diff --git a/kernel/src/shell/builtins.c b/kernel/src/shell/builtins.c index 6fe7e4a..f112502 100644 --- a/kernel/src/shell/builtins.c +++ b/kernel/src/shell/builtins.c @@ -4,8 +4,10 @@ #include #include +#include +#include + #include "../data/cats.h" -#include "types.h" const char* ascii_logo[] = { " /\\___/\\ ", @@ -25,13 +27,15 @@ int rectest(int a) { } void cmd_kfetch() { + u64 uptime_s = get_uptime() / 1000; + kprintf("\n\n"); kprintf("^p %s ^!\t\t^g kernel^!@^gtermos\n^0", ascii_logo[0]); kprintf("^p %s ^!\t\t^!-------------\n^!", ascii_logo[1]); kprintf("^p %s ^!\t\t^gOS^!: termOS 0.0.1\n^!", ascii_logo[2]); kprintf("^p %s ^!\t\t^gKernel^!: sucks\n^!", ascii_logo[3]); - kprintf("^p %s ^!\t\t^gUptime^!: 0h 0m\n^!", ascii_logo[4]); - kprintf("^p %s ^!\t\t^gShell^!: termosh\n^!", ascii_logo[5]); + kprintf("^p %s ^!\t\t^gUptime^!: %d seconds\n^!", ascii_logo[4], uptime_s); + kprintf("^p %s ^!\t\t^gShell^!: ksh\n^!", ascii_logo[5]); kprintf("^p %s ^p\t\t^gDE^!: shitgui\n^!", ascii_logo[6]); kprintf("^p %s ^p\t\t^gCPU^!: %s\n^!", ascii_logo[7], "cool one"); kprintf("\n\n"); @@ -66,3 +70,8 @@ void print_regs(Registers *regs) { kprintf("^gR15^!=%X\n",regs->r15); kprintf("--------------------------------\n"); } + + +void cmd_sleep() { + sleep(3000); +} \ No newline at end of file diff --git a/kernel/src/shell/ksh.c b/kernel/src/shell/ksh.c index 6b1f7dc..6131123 100644 --- a/kernel/src/shell/ksh.c +++ b/kernel/src/shell/ksh.c @@ -24,6 +24,8 @@ typedef enum { TOKEN_KFETCH, TOKEN_MEOW, + TOKEN_SLEEP, + TOKEN_REGS, TOKEN_RECTEST, TOKEN_PANIC, @@ -55,12 +57,14 @@ static const ksh_command_map token_map[] = { {"fastfetch", TOKEN_KFETCH}, {"neofetch", TOKEN_KFETCH}, + {"sleep", TOKEN_SLEEP}, {"regs", TOKEN_REGS}, {"rectest", TOKEN_RECTEST}, {"panic", TOKEN_PANIC}, {"ud2", TOKEN_PANIC_UD2}, {"pf", TOKEN_PANIC_PF}, + {"help", TOKEN_HELP}, {nullptr, TOKEN_NULL} }; @@ -82,6 +86,7 @@ void ksh() { case TOKEN_QUIT: return; // that'll cause panic lol + case TOKEN_SLEEP: cmd_sleep(); break; case TOKEN_REGS: cmd_regs(); break; case TOKEN_RECTEST: rectest(0); break; case TOKEN_PANIC: panic("Manually initiated panic");