From 18b3e9cbe7c85c23b6bcf6f2270a2fd184fd2df7 Mon Sep 17 00:00:00 2001 From: Karina Date: Sat, 27 Dec 2025 17:09:14 +0400 Subject: [PATCH] wip: pic. sending to continue on main pc --- kernel/CMakeLists.txt | 2 ++ kernel/include/io.h | 9 ++++++++- kernel/include/pic.h | 4 ++++ kernel/include/vmm.h | 1 - kernel/src/modules/console.c | 22 +++++++++++----------- kernel/src/modules/idt.c | 2 +- kernel/src/modules/io.c | 7 +++++++ kernel/src/modules/pic.c | 32 ++++++++++++++++++++++++++++++++ 8 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 kernel/include/pic.h create mode 100644 kernel/src/modules/io.c create mode 100644 kernel/src/modules/pic.c diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 0a1cc6f..2441801 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -12,6 +12,8 @@ add_executable(kernel src/entry.asm src/asm/interrupts.asm src/kmain.c + src/modules/io.c + src/modules/pic.c src/modules/gdt.c src/modules/idt.c src/modules/interrupts.c diff --git a/kernel/include/io.h b/kernel/include/io.h index b00161e..e81635d 100644 --- a/kernel/include/io.h +++ b/kernel/include/io.h @@ -1,3 +1,6 @@ +#ifndef IO_H +#define IO_H + static inline void outb(unsigned short port, unsigned char val) { __asm__ volatile( "outb %0, %1" @@ -15,4 +18,8 @@ static inline unsigned char inb(unsigned short port) { ); return ret; -} \ No newline at end of file +} + +void io_wait(); + +#endif \ No newline at end of file diff --git a/kernel/include/pic.h b/kernel/include/pic.h new file mode 100644 index 0000000..a829398 --- /dev/null +++ b/kernel/include/pic.h @@ -0,0 +1,4 @@ +#ifndef PIC_H +#define PIC_H + +#endif \ No newline at end of file diff --git a/kernel/include/vmm.h b/kernel/include/vmm.h index 7363d23..8ce760b 100644 --- a/kernel/include/vmm.h +++ b/kernel/include/vmm.h @@ -19,7 +19,6 @@ #define PTE_GET_ADDR(entry) ((entry) & PTE_ADDR_MASK) // get physical address #define PTE_GET_FLAGS(entry) ((entry) & ~PTE_ADDR_MASK) // get flags - #define VMM_PT_INDEX(virt) (((virt) >> 12) & 0x1FF) // Table Index (bits 12-20) #define VMM_PD_INDEX(virt) (((virt) >> 21) & 0x1FF) // Page Directory Index (bits 21-29) #define VMM_PDPT_INDEX(virt) (((virt) >> 30) & 0x1FF) // PDPT Index (bits 30-38) diff --git a/kernel/src/modules/console.c b/kernel/src/modules/console.c index 5dfd40c..b3926f1 100644 --- a/kernel/src/modules/console.c +++ b/kernel/src/modules/console.c @@ -6,20 +6,20 @@ #include "types.h" #include -#define COLOR_RED 0xFF5555 -#define COLOR_VERYRED 0xFF0000 -#define COLOR_GREEN 0x08bf39 +#define COLOR_RED 0xFF5555 +#define COLOR_VERYRED 0xFF0000 +#define COLOR_GREEN 0x08bf39 #define COLOR_VERYGREEN 0x00FF00 #define COLOR_TURQUOISE 0x5effaf -#define COLOR_BLUE 0x5555FF -#define COLOR_VERYBLUE 0x0000FF +#define COLOR_BLUE 0x5555FF +#define COLOR_VERYBLUE 0x0000FF #define COLOR_LIGHTBLUE 0x3890e8 -#define COLOR_YELLOW 0xFFFF55 -#define COLOR_CYAN 0x55FFFF -#define COLOR_MAGENTA 0xFF55FF -#define COLOR_BLACK 0x000000 -#define COLOR_WHITE 0xFFFFFF -#define COLOR_PINK 0xFFA3B1 +#define COLOR_YELLOW 0xFFFF55 +#define COLOR_CYAN 0x55FFFF +#define COLOR_MAGENTA 0xFF55FF +#define COLOR_BLACK 0x000000 +#define COLOR_WHITE 0xFFFFFF +#define COLOR_PINK 0xFFA3B1 static SG_Context *ctx_ptr = nullptr; static SG_Point s_cursor_pos = {0}; diff --git a/kernel/src/modules/idt.c b/kernel/src/modules/idt.c index 85ebabb..c21a308 100644 --- a/kernel/src/modules/idt.c +++ b/kernel/src/modules/idt.c @@ -72,4 +72,4 @@ void idt_init() { idt[14].ist = 1; __asm__ volatile ("lidt %0" : : "m"(idt_ptr)); -} \ No newline at end of file +} diff --git a/kernel/src/modules/io.c b/kernel/src/modules/io.c new file mode 100644 index 0000000..46123e8 --- /dev/null +++ b/kernel/src/modules/io.c @@ -0,0 +1,7 @@ +#include "io.h" + +// sending junk to unused port letting cpu skipping few tacts. +// not ideal i know. +void io_wait() { + outb(0x80, 0x0); +} \ No newline at end of file diff --git a/kernel/src/modules/pic.c b/kernel/src/modules/pic.c new file mode 100644 index 0000000..1ea3e77 --- /dev/null +++ b/kernel/src/modules/pic.c @@ -0,0 +1,32 @@ +#include "pic.h" +#include "io.h" +#include "types.h" + +#define MASTER_COMMAND 0x20 +#define MASTER_DATA 0x21 +#define SLAVE_COMMAND 0xA0 +#define SLAVE_DATA 0xA1 + +static inline void send(unsigned short port, unsigned char val) { + outb(port, val); + io_wait(); +} + +void pic_remap() { + u64 curr_master = inb(MASTER_DATA); + u64 curr_slave = inb(SLAVE_DATA); + + // initialization + send(MASTER_COMMAND, 0x11); + send(SLAVE_COMMAND, 0x11); + + send(MASTER_DATA, 0x20); // master now controlling idt[32..39] + send(SLAVE_DATA, 0x28); // idt[40..47] + + send(MASTER_DATA, 0x04); // slave on irq2 + send(SLAVE_DATA, 0x02); // assign id = 2 to slave + + + + +} \ No newline at end of file