From e644bc557744865eff056d92be85c704daffa823 Mon Sep 17 00:00:00 2001 From: Karina Date: Sat, 27 Dec 2025 20:54:19 +0400 Subject: [PATCH] feat: irq interrupts; basic kb driver --- kernel/CMakeLists.txt | 1 + kernel/include/io.h | 5 ++ kernel/include/keyboard.h | 8 +++ kernel/include/pic.h | 4 ++ kernel/src/asm/interrupts.asm | 92 ++++++++++++++++++++++----------- kernel/src/kmain.c | 22 ++------ kernel/src/modules/idt.c | 4 ++ kernel/src/modules/interrupts.c | 13 +++++ kernel/src/modules/keyboard.c | 10 ++++ kernel/src/modules/panic.c | 4 +- 10 files changed, 112 insertions(+), 51 deletions(-) create mode 100644 kernel/include/keyboard.h create mode 100644 kernel/src/modules/keyboard.c diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 2c6444c..65869eb 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -23,6 +23,7 @@ add_executable(kernel src/modules/console.c src/modules/rand.c src/modules/panic.c + src/modules/keyboard.c src/modules/kfetch.c data/font8x16.c ) diff --git a/kernel/include/io.h b/kernel/include/io.h index 5a3d073..1edeeb9 100644 --- a/kernel/include/io.h +++ b/kernel/include/io.h @@ -4,6 +4,11 @@ #ifndef IO_H #define IO_H +#define MASTER_COMMAND 0x20 +#define MASTER_DATA 0x21 +#define SLAVE_COMMAND 0xA0 +#define SLAVE_DATA 0xA1 + static inline void outb(unsigned short port, unsigned char val) { __asm__ volatile( "outb %0, %1" diff --git a/kernel/include/keyboard.h b/kernel/include/keyboard.h new file mode 100644 index 0000000..8e61566 --- /dev/null +++ b/kernel/include/keyboard.h @@ -0,0 +1,8 @@ +#ifndef KEYBOARD_H +#define KEYBOARD_H + +#include "types.h" + +void kb_handler(Registers *regs); + +#endif \ No newline at end of file diff --git a/kernel/include/pic.h b/kernel/include/pic.h index bd584b2..5eed781 100644 --- a/kernel/include/pic.h +++ b/kernel/include/pic.h @@ -4,4 +4,8 @@ #ifndef PIC_H #define PIC_H +#include "types.h" + +u16 pic_remap(); + #endif \ No newline at end of file diff --git a/kernel/src/asm/interrupts.asm b/kernel/src/asm/interrupts.asm index aa9f4f9..ce391fe 100644 --- a/kernel/src/asm/interrupts.asm +++ b/kernel/src/asm/interrupts.asm @@ -4,6 +4,7 @@ bits 64 extern isr_handler_c +extern irq_handler_c section .text @@ -22,6 +23,60 @@ isr%1: jmp isr_common_stub %endmacro +%macro PUSHALL 0 + push r15 + push r14 + push r13 + push r12 + push r11 + push r10 + push r9 + push r8 + push rbp + push rdi + push rsi + push rdx + push rcx + push rbx + push rax +%endmacro + +%macro POPALL 0 + pop rax + pop rbx + pop rcx + pop rdx + pop rsi + pop rdi + pop rbp + pop r8 + pop r9 + pop r10 + pop r11 + pop r12 + pop r13 + pop r14 + pop r15 +%endmacro + +%macro IRQ_HANDLER 2 +global %2 +%2: + push 0 ; dummy err code + push %1 + + PUSHALL + + mov rdi, rsp + cld + call irq_handler_c + + POPALL + + add rsp, 16 + iretq +%endmacro + ISR_NOERRCODE 0 ; Divide by zero ISR_NOERRCODE 1 ; Debug ISR_NOERRCODE 2 ; NMI @@ -56,40 +111,12 @@ ISR_ERRCODE 30 ; Security Exception ISR_NOERRCODE 31 ; Reserved isr_common_stub: - push r15 - push r14 - push r13 - push r12 - push r11 - push r10 - push r9 - push r8 - push rdi - push rsi - push rbp - push rdx - push rcx - push rbx - push rax + PUSHALL mov rdi, rsp call isr_handler_c - pop rax - pop rbx - pop rcx - pop rdx - pop rbp - pop rsi - pop rdi - pop r8 - pop r9 - pop r10 - pop r11 - pop r12 - pop r13 - pop r14 - pop r15 + POPALL add rsp, 16 iretq @@ -97,4 +124,7 @@ isr_common_stub: global idt_load idt_load: lidt [rdi] - ret \ No newline at end of file + ret + +IRQ_HANDLER 32, irq0 +IRQ_HANDLER 33, irq1 \ No newline at end of file diff --git a/kernel/src/kmain.c b/kernel/src/kmain.c index 4835d97..e5ae0fb 100644 --- a/kernel/src/kmain.c +++ b/kernel/src/kmain.c @@ -11,19 +11,13 @@ #include "gdt.h" #include "idt.h" +#include "pic.h" #include "pmm.h" #include "vmm.h" #include "../data/logo.h" #include "vmm.h" - -int rectest(int a) { - volatile int b = a + 1; - kprintf("%d", b); - return rectest(b * 2); -} - extern u64 _kernel_end; extern u8* bitmap; extern u64 bitmap_size_g; @@ -49,6 +43,7 @@ void kmain(Bootinfo* info) { gdt_init(); idt_init(); + pic_remap(); SG_Point logo_point = {0, 10}; sg_put_img(&sg_ctx, &logo_point, &logo_img); @@ -68,18 +63,7 @@ void kmain(Bootinfo* info) { vmm_init(info); kprintf("\nIM ALIVE :D"); - - // kprintf("\nSetting up guard page test"); - // u64* new_stack_phys = pmm_alloc_page(); - // u64 stack_top = 0x40000000; - // vmm_map_page(pml4_kernel, (u64)new_stack_phys, stack_top, PTE_PRESENT | PTE_RW); - - // __asm__ volatile ( - // "mov %0, %%rsp \n" - // :: "r"(stack_top + 4096) - // ); - - // rectest(0); + __asm__ volatile ("sti"); while (1) { __asm__("hlt"); } } \ No newline at end of file diff --git a/kernel/src/modules/idt.c b/kernel/src/modules/idt.c index 1ffb5ca..4efe7ad 100644 --- a/kernel/src/modules/idt.c +++ b/kernel/src/modules/idt.c @@ -15,6 +15,7 @@ extern void isr16(); extern void isr17(); extern void isr18(); extern void isr19 extern void isr20(); extern void isr21(); extern void isr22(); extern void isr23(); extern void isr24(); extern void isr25(); extern void isr26(); extern void isr27(); extern void isr28(); extern void isr29(); extern void isr30(); extern void isr31(); +extern void irq0(void); extern void irq1(void); extern void idt_load(u64); // asm: lidt [rdi] / ret @@ -74,5 +75,8 @@ void idt_init() { idt[13].ist = 1; idt[14].ist = 1; + idt_set_gate(32, (u64)irq0, selector, flags); + idt_set_gate(33, (u64)irq1, selector, flags); + __asm__ volatile ("lidt %0" : : "m"(idt_ptr)); } diff --git a/kernel/src/modules/interrupts.c b/kernel/src/modules/interrupts.c index 534d5d5..a27a90e 100644 --- a/kernel/src/modules/interrupts.c +++ b/kernel/src/modules/interrupts.c @@ -1,9 +1,22 @@ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright (c) 2025 0xKarinyash +#include "io.h" #include "panic.h" +#include "keyboard.h" #include "types.h" + void isr_handler_c(Registers *regs) { panic_exception(regs); +} + +void irq_handler_c(Registers *regs) { + switch (regs->int_no) { + case 32: return outb(MASTER_COMMAND, 0x20); + case 33: return kb_handler(regs); + default: outb(SLAVE_COMMAND, 0x20); break; + } + + outb(MASTER_COMMAND, 0x20); } \ No newline at end of file diff --git a/kernel/src/modules/keyboard.c b/kernel/src/modules/keyboard.c new file mode 100644 index 0000000..824d1f6 --- /dev/null +++ b/kernel/src/modules/keyboard.c @@ -0,0 +1,10 @@ +#include "keyboard.h" +#include "console.h" +#include "io.h" +#include "types.h" + +void kb_handler(Registers *regs) { + u8 scancode = inb(0x60); + outb(MASTER_COMMAND, 0x20); + kprintf("Key: %x\n", scancode); +} \ No newline at end of file diff --git a/kernel/src/modules/panic.c b/kernel/src/modules/panic.c index 421566d..e8b8f73 100644 --- a/kernel/src/modules/panic.c +++ b/kernel/src/modules/panic.c @@ -47,7 +47,9 @@ const char* fun_messages[] = { "Pro tip: dont crash", "Stop ricing the kernel you loonixtard, TermOS is NOT Loonix", "Attaboy, Jack. He's good. Really good.", - "" + "Zhenih priehal", + "YOUR PC WAS BLOCKED BY FBI FOR WATCHING PORNOGRAPHY SEND 20 US DOLLARS", + "fuck off" };