From af4d0327e4e759853bf74c3c644b16b97365d080 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Sat, 29 Aug 2026 13:28:50 +0100 Subject: [PATCH 01/12] init intrupts --- build/kernel_sectors.inc | 1 + includes/isr.h | 4 +++- includes/utils.h | 2 ++ includes/vga.h | 2 ++ src/driver/vga.c | 11 +++++++++++ src/interrupt/isr.asm | 14 ++++++-------- src/interrupt/isr.c | 11 ++++++++++- src/kernel/kernel.c | 31 ++++++++++++++++++++++++++++++- src/utils/utils.c | 12 ++++++++++++ 9 files changed, 77 insertions(+), 11 deletions(-) create mode 100644 build/kernel_sectors.inc diff --git a/build/kernel_sectors.inc b/build/kernel_sectors.inc new file mode 100644 index 0000000..5fd6b90 --- /dev/null +++ b/build/kernel_sectors.inc @@ -0,0 +1 @@ +KERNEL_SECTORS equ 15 diff --git a/includes/isr.h b/includes/isr.h index 786d4dc..04b952b 100644 --- a/includes/isr.h +++ b/includes/isr.h @@ -1,6 +1,8 @@ #ifndef ISR_H #define ISR_H -void isr_handler(); +#include + +void isr_handler(uint32_t vector); #endif \ No newline at end of file diff --git a/includes/utils.h b/includes/utils.h index cd800ef..eeb906f 100644 --- a/includes/utils.h +++ b/includes/utils.h @@ -12,4 +12,6 @@ void cli(void); void sti(void); void hlt(void); +uint32_t read_eflags(void); + #endif \ No newline at end of file diff --git a/includes/vga.h b/includes/vga.h index 8c9c797..ec2b7cc 100644 --- a/includes/vga.h +++ b/includes/vga.h @@ -46,6 +46,8 @@ void vga_print_char(char c); void vga_print(const char *str); +void vga_print_hex(uint32_t value); + void vga_scan_char(char c); void vga_scan(const char *str); diff --git a/src/driver/vga.c b/src/driver/vga.c index b5541e5..9f9f8f8 100644 --- a/src/driver/vga.c +++ b/src/driver/vga.c @@ -46,6 +46,17 @@ void vga_print(const char *str) { } } +void vga_print_hex(uint32_t value){ + const char hex[] = "0123456789ABCDEF"; + + vga_print("0x"); + + for (int i = 7; i >= 0; i--) { + uint8_t digit = (value >> (i * 4)) & 0xF; + vga_print_char(hex[digit]); + } +} + void vga_set_color(uint8_t foreground, uint8_t background) { current_color = (background << 4 | foreground); } diff --git a/src/interrupt/isr.asm b/src/interrupt/isr.asm index 60ff058..458775d 100644 --- a/src/interrupt/isr.asm +++ b/src/interrupt/isr.asm @@ -14,7 +14,7 @@ global isr%1 isr%1: pusha - push %1 + push dword %1 call isr_handler add esp, 4 @@ -35,20 +35,22 @@ global isr%1 isr%1: pusha - push %1 + push dword %1 call isr_handler add esp, 4 popa + ; Remove CPU-pushed error code add esp, 4 + iret %endmacro ; ============================================================ -; EXCEPTIONS 0-31 +; CPU EXCEPTIONS 0-31 ; ============================================================ ISR_NOERRCODE 0 @@ -118,17 +120,13 @@ section .rodata global isr_table -%macro ISR_TABLE_ENTRY 1 - dd isr%1 -%endmacro - isr_table: %assign i 0 %rep 256 - ISR_TABLE_ENTRY i + dd isr%+i %assign i i + 1 diff --git a/src/interrupt/isr.c b/src/interrupt/isr.c index ce59cb1..458e974 100644 --- a/src/interrupt/isr.c +++ b/src/interrupt/isr.c @@ -1,3 +1,12 @@ #include "isr.h" +#include "vga.h" -void isr_handler() {} \ No newline at end of file +void isr_handler(uint32_t vector){ + vga_print("INT: "); + vga_print_hex(vector); + vga_print("\n"); + vga_print_hex(vector); + + for (;;) + asm volatile ("hlt"); +} diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 3c41309..246fdc6 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -1,6 +1,8 @@ #include "kernel.h" #include "pic.h" +#include "idt.h" #include "vga.h" +#include "utils.h" void kernel_main() { @@ -9,7 +11,34 @@ void kernel_main() { vga_print("[init] pic"); pic_init(); - vga_print("... Ok"); + vga_print(" ... Ok\n"); + vga_print("[init] idt masks: "); + idt_init(); + vga_print("... Ok\n"); + + + // pic_clear_mask(0); + + vga_print("[init] irq0 enabled\n"); + uint32_t before = read_eflags(); + + sti(); + + uint32_t after = read_eflags(); + + vga_print("EFLAGS before: "); + vga_print_hex(before); + + vga_print("\nEFLAGS after: "); + vga_print_hex(after); + + asm volatile ("int $0x24"); + + for (;;) { + asm volatile ("cli"); + } + + return; } diff --git a/src/utils/utils.c b/src/utils/utils.c index 81e83f2..150d45e 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -30,3 +30,15 @@ void io_wait(void) { // delay for I/O operation __asm__ volatile("outb %%al, $0x80" : : "a"(0)); } + + +uint32_t read_eflags(void) +{ + uint32_t flags; + asm volatile ( + "pushf\n" + "pop %0" + : "=r"(flags) + ); + return flags; +} \ No newline at end of file From c15a87bf6bc1134578e5ab290ba0e706d3cf6f59 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Mon, 31 Aug 2026 00:15:32 +0100 Subject: [PATCH 02/12] add vga lib --- includes/lib/vga_lib.h | 34 ++++++++++++ includes/vga.h | 3 ++ src/driver/vga.c | 2 +- src/libs/vga_lib.c | 117 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 includes/lib/vga_lib.h create mode 100644 src/libs/vga_lib.c diff --git a/includes/lib/vga_lib.h b/includes/lib/vga_lib.h new file mode 100644 index 0000000..fbda465 --- /dev/null +++ b/includes/lib/vga_lib.h @@ -0,0 +1,34 @@ +#ifndef VGA_LIB_H +#define VGA_LIB_H + +#include + +/* + * Logging + */ +void vga_log_info(const char *str); +void vga_log_success(const char *str); +void vga_log_warning(const char *str); +void vga_log_error(const char *str); + +/* + * Text utilities + */ +void vga_println(const char *str); +void vga_print_at_end(const char *str); +void vga_print_line_at(uint8_t row, const char *str); +void vga_print_centered(const char *str, uint8_t row); + +/* + * Screen utilities + */ +void vga_clear_line(uint8_t row); +void vga_clear_screen(void); + +/* + * Cursor utilities + */ +void vga_newline(void); +void vga_home(void); + +#endif \ No newline at end of file diff --git a/includes/vga.h b/includes/vga.h index ec2b7cc..7ac5eaf 100644 --- a/includes/vga.h +++ b/includes/vga.h @@ -29,6 +29,9 @@ #define LIGHT_FLAG 0x08 +#define DEFUALT_F LIGHT_GRAY +#define DEFUALT_B BLACK + typedef union vga_entry { uint16_t value; diff --git a/src/driver/vga.c b/src/driver/vga.c index 9f9f8f8..d475c34 100644 --- a/src/driver/vga.c +++ b/src/driver/vga.c @@ -46,7 +46,7 @@ void vga_print(const char *str) { } } -void vga_print_hex(uint32_t value){ +void vga_print_hex(uint32_t value) { const char hex[] = "0123456789ABCDEF"; vga_print("0x"); diff --git a/src/libs/vga_lib.c b/src/libs/vga_lib.c new file mode 100644 index 0000000..c152303 --- /dev/null +++ b/src/libs/vga_lib.c @@ -0,0 +1,117 @@ +#include "vga_lib.h" +#include "vga.h" + +/* + * Logging + */ + +void vga_log_info(const char *str) { + vga_set_color(BLUE, DEFUALT_B); + + vga_print(str); + + vga_set_color(DEFUALT_F, DEFUALT_B); +} + +void vga_log_success(const char *str) { + vga_set_color(GREEN, DEFUALT_B); + + vga_print(str); + + vga_set_color(DEFUALT_F, DEFUALT_B); +} + +void vga_log_warning(const char *str) { + vga_set_color(BROWN, DEFUALT_B); + + vga_print(str); + + vga_set_color(DEFUALT_F, DEFUALT_B); +} + +void vga_log_error(const char *str) { + vga_set_color(RED, DEFUALT_B); + + vga_print(str); + + vga_set_color(DEFUALT_F, DEFUALT_B); +} + +/* + * Text utilities + */ + +void vga_println(const char *str) { + vga_print(str); + vga_newline(); +} + +void vga_print_at_end(const char *str) { + uint8_t length = 0; + + while (str[length] != '\0') + length++; + + if (length >= VGA_WIDTH) + length = VGA_WIDTH; + + vga_set_cursor(VGA_WIDTH - length, VGA_HEIGHT - 1); + + vga_print(str); +} + +void vga_print_line_at(uint8_t row, const char *str) { + if (row >= VGA_HEIGHT) + return; + + vga_set_cursor(0, row); + vga_print(str); +} + +void vga_print_centered(const char *str, uint8_t row) { + uint8_t length = 0; + + if (row >= VGA_HEIGHT) + return; + + while (str[length] != '\0') + length++; + + if (length >= VGA_WIDTH) + length = VGA_WIDTH; + + uint8_t x = (VGA_WIDTH - length) / 2; + + vga_set_cursor(x, row); + vga_print(str); +} + +/* + * Screen utilities + */ + +void vga_clear_line(uint8_t row) { + if (row >= VGA_HEIGHT) + return; + + vga_set_cursor(0, row); + + for (uint8_t x = 0; x < VGA_WIDTH; x++) + vga_print_char(' '); +} + +void vga_clear_screen(void) { vga_clear(); } + +/* + * Cursor utilities + */ + +void vga_newline(void) { + uint8_t y = vga_get_cursor_y(); + + if (y < VGA_HEIGHT - 1) { + vga_set_cursor(0, y + 1); + } +} + +void vga_home(void) { vga_set_cursor(0, 0); } \ No newline at end of file From 8af21f98aea32d126d266baf17746ca98c93f07f Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Mon, 31 Aug 2026 00:23:34 +0100 Subject: [PATCH 03/12] update git ignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e4f4aca..4c8eb37 100644 --- a/.gitignore +++ b/.gitignore @@ -60,4 +60,7 @@ dkms.conf *.img -.vscode \ No newline at end of file +.vscode +**.inc + +build/* \ No newline at end of file From d836c9e493837e22eb2d6db75d5907f0ac840033 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Mon, 31 Aug 2026 00:23:52 +0100 Subject: [PATCH 04/12] update dynamic includes --- Makefile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 7299871..534f6d8 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,8 @@ DOCKER_RUN := docker run --rm \ -e PATH=/home/linuxbrew/.linuxbrew/bin:$$PATH \ $(DOCKER_IMAGE) +INCLUDE_DIRS := $(shell find $(INCLUDE_DIR) -type d) + CFLAGS := \ -g \ -O0 \ @@ -44,8 +46,8 @@ CFLAGS := \ -nostdlib \ -nostartfiles \ -nodefaultlibs \ - -I$(INCLUDE_DIR) - + $(foreach dir,$(INCLUDE_DIRS),-I$(dir)) + .PHONY: all clean run debug format format-check lint all: $(OS_BIN) From 8db6e1b06e2aa081e1a208cb8b4df4bb8714c80d Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Mon, 31 Aug 2026 00:24:24 +0100 Subject: [PATCH 05/12] add panic --- includes/panic.h | 6 ++++++ src/kernel/panic.c | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 includes/panic.h create mode 100644 src/kernel/panic.c diff --git a/includes/panic.h b/includes/panic.h new file mode 100644 index 0000000..485bd68 --- /dev/null +++ b/includes/panic.h @@ -0,0 +1,6 @@ +#ifndef PANIC_H +#define PANIC_H + +void panic(char *err); + +#endif \ No newline at end of file diff --git a/src/kernel/panic.c b/src/kernel/panic.c new file mode 100644 index 0000000..f99bd88 --- /dev/null +++ b/src/kernel/panic.c @@ -0,0 +1,13 @@ +#include "lib/vga_lib.h" +#include "utils.h" +#include "vga.h" + +void panic(char *err) { + vga_log_error("\nKERNEL PANIC: "); + vga_print(err); + + cli(); + + for (;;) + hlt(); +} \ No newline at end of file From 2886da32ebc68503d9df422ffe45c5d238072be6 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Mon, 31 Aug 2026 00:48:51 +0100 Subject: [PATCH 06/12] update vga lib --- includes/lib/vga_lib.h | 9 +++++---- src/libs/vga_lib.c | 35 +++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/includes/lib/vga_lib.h b/includes/lib/vga_lib.h index fbda465..b19ccb6 100644 --- a/includes/lib/vga_lib.h +++ b/includes/lib/vga_lib.h @@ -6,16 +6,17 @@ /* * Logging */ -void vga_log_info(const char *str); -void vga_log_success(const char *str); -void vga_log_warning(const char *str); -void vga_log_error(const char *str); +void vga_log_info(const char *str0, const char *str, const char *str2) ; +void vga_log_success(const char *str0, const char *str, const char *str2) ; +void vga_log_warning(const char *str0, const char *str, const char *str2) ; +void vga_log_error(const char *str0, const char *str, const char *str2) ; /* * Text utilities */ void vga_println(const char *str); void vga_print_at_end(const char *str); +void vga_print_at_end_c(const char *str, uint8_t color); void vga_print_line_at(uint8_t row, const char *str); void vga_print_centered(const char *str, uint8_t row); diff --git a/src/libs/vga_lib.c b/src/libs/vga_lib.c index c152303..52b5581 100644 --- a/src/libs/vga_lib.c +++ b/src/libs/vga_lib.c @@ -5,38 +5,55 @@ * Logging */ -void vga_log_info(const char *str) { +void vga_log_info(const char *str0, const char *str, const char *str2) { + vga_print(str0); + vga_set_color(BLUE, DEFUALT_B); vga_print(str); vga_set_color(DEFUALT_F, DEFUALT_B); + + vga_print(str2); } -void vga_log_success(const char *str) { +void vga_log_success(const char *str0, const char *str, const char *str2) { + vga_print(str0); + vga_set_color(GREEN, DEFUALT_B); vga_print(str); vga_set_color(DEFUALT_F, DEFUALT_B); + + vga_print(str2); } -void vga_log_warning(const char *str) { +void vga_log_warning(const char *str0, const char *str, const char *str2) { + vga_print(str0); + vga_set_color(BROWN, DEFUALT_B); vga_print(str); vga_set_color(DEFUALT_F, DEFUALT_B); + + vga_print(str2); } -void vga_log_error(const char *str) { +void vga_log_error(const char *str0, const char *str, const char *str2) { + vga_print(str0); + vga_set_color(RED, DEFUALT_B); vga_print(str); vga_set_color(DEFUALT_F, DEFUALT_B); + + vga_print(str2); } + /* * Text utilities */ @@ -55,11 +72,17 @@ void vga_print_at_end(const char *str) { if (length >= VGA_WIDTH) length = VGA_WIDTH; - vga_set_cursor(VGA_WIDTH - length, VGA_HEIGHT - 1); - + vga_set_cursor(VGA_WIDTH - length, vga_get_cursor_y()); vga_print(str); } +void vga_print_at_end_c(const char *str, uint8_t color) { + + vga_set_color(color, DEFUALT_B); + vga_print_at_end(str); + vga_set_color(DEFUALT_F, DEFUALT_B); +} + void vga_print_line_at(uint8_t row, const char *str) { if (row >= VGA_HEIGHT) return; From e9f7750fa6b445da1cc6cf8d8fb5d04fe21faa56 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Mon, 31 Aug 2026 00:49:30 +0100 Subject: [PATCH 07/12] formate code --- includes/lib/vga_lib.h | 8 ++++---- src/interrupt/isr.c | 6 +++--- src/kernel/kernel.c | 40 ++++++++++++++-------------------------- src/kernel/panic.c | 3 +-- src/libs/vga_lib.c | 1 - src/utils/utils.c | 25 +++++++------------------ 6 files changed, 29 insertions(+), 54 deletions(-) diff --git a/includes/lib/vga_lib.h b/includes/lib/vga_lib.h index b19ccb6..492d4a5 100644 --- a/includes/lib/vga_lib.h +++ b/includes/lib/vga_lib.h @@ -6,10 +6,10 @@ /* * Logging */ -void vga_log_info(const char *str0, const char *str, const char *str2) ; -void vga_log_success(const char *str0, const char *str, const char *str2) ; -void vga_log_warning(const char *str0, const char *str, const char *str2) ; -void vga_log_error(const char *str0, const char *str, const char *str2) ; +void vga_log_info(const char *str0, const char *str, const char *str2); +void vga_log_success(const char *str0, const char *str, const char *str2); +void vga_log_warning(const char *str0, const char *str, const char *str2); +void vga_log_error(const char *str0, const char *str, const char *str2); /* * Text utilities diff --git a/src/interrupt/isr.c b/src/interrupt/isr.c index 458e974..897a8e5 100644 --- a/src/interrupt/isr.c +++ b/src/interrupt/isr.c @@ -1,12 +1,12 @@ #include "isr.h" #include "vga.h" -void isr_handler(uint32_t vector){ +void isr_handler(uint32_t vector) { vga_print("INT: "); vga_print_hex(vector); vga_print("\n"); - vga_print_hex(vector); + vga_print_hex(vector); for (;;) - asm volatile ("hlt"); + asm volatile("hlt"); } diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 246fdc6..245e05b 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -1,44 +1,32 @@ #include "kernel.h" -#include "pic.h" #include "idt.h" -#include "vga.h" +#include "panic.h" +#include "pic.h" #include "utils.h" +#include "vga.h" +#include "vga_lib.h" void kernel_main() { vga_init(); - vga_print("[init] vga driver ... Ok\n"); + vga_log_info("[", "init", "] vga"); + vga_print_at_end_c("... Ok\n", GREEN); - vga_print("[init] pic"); + vga_log_info("[", "init", "] pic"); pic_init(); - vga_print(" ... Ok\n"); + vga_print_at_end_c("... Ok\n", GREEN); - vga_print("[init] idt masks: "); + vga_log_info("[", "init", "] idt"); idt_init(); - vga_print("... Ok\n"); - - - // pic_clear_mask(0); + vga_print_at_end_c("... Ok\n", GREEN); - vga_print("[init] irq0 enabled\n"); - uint32_t before = read_eflags(); + panic("testing panics"); - sti(); - - uint32_t after = read_eflags(); - - vga_print("EFLAGS before: "); - vga_print_hex(before); - - vga_print("\nEFLAGS after: "); - vga_print_hex(after); - - asm volatile ("int $0x24"); + asm volatile("int $0x24"); for (;;) { - asm volatile ("cli"); + asm volatile("cli"); } - - + return; } diff --git a/src/kernel/panic.c b/src/kernel/panic.c index f99bd88..ff0f3cd 100644 --- a/src/kernel/panic.c +++ b/src/kernel/panic.c @@ -3,8 +3,7 @@ #include "vga.h" void panic(char *err) { - vga_log_error("\nKERNEL PANIC: "); - vga_print(err); + vga_log_error("", "\nKERNEL PANIC: ", err); cli(); diff --git a/src/libs/vga_lib.c b/src/libs/vga_lib.c index 52b5581..c4fafc6 100644 --- a/src/libs/vga_lib.c +++ b/src/libs/vga_lib.c @@ -53,7 +53,6 @@ void vga_log_error(const char *str0, const char *str, const char *str2) { vga_print(str2); } - /* * Text utilities */ diff --git a/src/utils/utils.c b/src/utils/utils.c index 150d45e..ee949a3 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -13,32 +13,21 @@ uint8_t inb(uint16_t port) { return value; } +void cli(void) { __asm__ volatile("cli"); } -void cli(void){ - __asm__ volatile("cli"); -} +void sti(void) { __asm__ volatile("sti"); } -void sti(void) { - __asm__ volatile ("sti"); -} - -void hlt(void) { - __asm__ volatile ("hlt"); -} +void hlt(void) { __asm__ volatile("hlt"); } void io_wait(void) { // delay for I/O operation __asm__ volatile("outb %%al, $0x80" : : "a"(0)); } - -uint32_t read_eflags(void) -{ +uint32_t read_eflags(void) { uint32_t flags; - asm volatile ( - "pushf\n" - "pop %0" - : "=r"(flags) - ); + asm volatile("pushf\n" + "pop %0" + : "=r"(flags)); return flags; } \ No newline at end of file From 2be4158cad33ac17b0a75c8fa5436b7ee4c8f8db Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Sat, 5 Sep 2026 16:47:15 +0100 Subject: [PATCH 08/12] complite kerna exceptions --- includes/idt.h | 2 +- includes/isr.h | 36 ++++++++++++++++++++++++++++++++++++ includes/panic.h | 2 +- src/interrupt/isr.c | 17 +++++++++++++---- src/kernel/panic.c | 12 ++++++++++++ 5 files changed, 63 insertions(+), 6 deletions(-) diff --git a/includes/idt.h b/includes/idt.h index 4d44bd0..c82d138 100644 --- a/includes/idt.h +++ b/includes/idt.h @@ -8,7 +8,7 @@ #define IDT_INTERRUPT_GATE 0x8E #define KERNEL_CODE_SELECTOR 0x08 -extern uint32_t isr_table[32]; +extern uint32_t isr_table[256]; struct idt_entry { uint16_t offset_low; // handler address bits 0..15 diff --git a/includes/isr.h b/includes/isr.h index 04b952b..bc1dd30 100644 --- a/includes/isr.h +++ b/includes/isr.h @@ -3,6 +3,42 @@ #include +char* EXCEPTIONS[] = { + "Division Error", // 00 + "Debug", // 01 + "Non-maskable Interrupt", // 02 + "Breakpoint", // 03 + "Overflow", // 04 + "Bound Range Exceeded", // 05 + "Invalid Opcode", // 06 + "Device Not Available", // 07 + "Double Fault", // 08 + "Coprocessor Segment Overrun", // 09 + "Invalid TSS", // 10 + "Segment Not Present", // 11 + "Stack-Segment Fault", // 12 + "General Protection Fault", // 13 + "Page Fault", // 14 + "-15", // 15 + "x87 Floating-Point Exception", // 16 + "Alignment Check", // 17 + "Machine Check", // 18 + "SIMD Floating-Point Exception", // 19 + "Virtualization Exception", // 20 + "Control Protection Exception", // 21 + "-22", // 22 + "-23", // 23 + "-24", // 24 + "-25", // 25 + "-26", // 26 + "-27", // 27 + "Hypervisor Injection Exception", // 28 + "VMM Communication Exception", // 29 + "Security Exception", // 30 + "-31" // 31 +}; + + void isr_handler(uint32_t vector); #endif \ No newline at end of file diff --git a/includes/panic.h b/includes/panic.h index 485bd68..2054d72 100644 --- a/includes/panic.h +++ b/includes/panic.h @@ -2,5 +2,5 @@ #define PANIC_H void panic(char *err); - +void exception(char *err); #endif \ No newline at end of file diff --git a/src/interrupt/isr.c b/src/interrupt/isr.c index 897a8e5..0d24808 100644 --- a/src/interrupt/isr.c +++ b/src/interrupt/isr.c @@ -1,12 +1,21 @@ #include "isr.h" #include "vga.h" +#include "panic.h" -void isr_handler(uint32_t vector) { - vga_print("INT: "); - vga_print_hex(vector); +void isr_exeption_handler(uint32_t vector) { + exception(EXCEPTIONS[vector]); vga_print("\n"); - vga_print_hex(vector); for (;;) asm volatile("hlt"); } + +void isr_handler(uint32_t vector) { + if (vector <= 31) { + isr_exeption_handler(vector); + } + + vga_print("INT: "); + vga_print_hex(vector); + vga_print("\n"); +} diff --git a/src/kernel/panic.c b/src/kernel/panic.c index ff0f3cd..d0819a9 100644 --- a/src/kernel/panic.c +++ b/src/kernel/panic.c @@ -1,12 +1,24 @@ #include "lib/vga_lib.h" #include "utils.h" #include "vga.h" +#include "panic.h" void panic(char *err) { + vga_print("\n"); vga_log_error("", "\nKERNEL PANIC: ", err); cli(); + for (;;) + hlt(); +} + +void exception(char *err) { + vga_print("\n"); + vga_log_error("", "\nKERNEL EXCEPTION: ", err); + + cli(); + for (;;) hlt(); } \ No newline at end of file From b2bacde9277806a6b57cdbcd9b78da0fcc18bcad Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Sat, 5 Sep 2026 16:55:46 +0100 Subject: [PATCH 09/12] update isr --- includes/isr.h | 67 ++++++++++++++++++++++----------------------- src/interrupt/isr.c | 19 ++++--------- src/kernel/panic.c | 2 +- 3 files changed, 39 insertions(+), 49 deletions(-) diff --git a/includes/isr.h b/includes/isr.h index bc1dd30..a719e6e 100644 --- a/includes/isr.h +++ b/includes/isr.h @@ -3,42 +3,41 @@ #include -char* EXCEPTIONS[] = { - "Division Error", // 00 - "Debug", // 01 - "Non-maskable Interrupt", // 02 - "Breakpoint", // 03 - "Overflow", // 04 - "Bound Range Exceeded", // 05 - "Invalid Opcode", // 06 - "Device Not Available", // 07 - "Double Fault", // 08 - "Coprocessor Segment Overrun", // 09 - "Invalid TSS", // 10 - "Segment Not Present", // 11 - "Stack-Segment Fault", // 12 - "General Protection Fault", // 13 - "Page Fault", // 14 - "-15", // 15 - "x87 Floating-Point Exception", // 16 - "Alignment Check", // 17 - "Machine Check", // 18 - "SIMD Floating-Point Exception", // 19 - "Virtualization Exception", // 20 - "Control Protection Exception", // 21 - "-22", // 22 - "-23", // 23 - "-24", // 24 - "-25", // 25 - "-26", // 26 - "-27", // 27 - "Hypervisor Injection Exception", // 28 - "VMM Communication Exception", // 29 - "Security Exception", // 30 - "-31" // 31 +char *EXCEPTIONS[] = { + "Division Error", // 00 + "Debug", // 01 + "Non-maskable Interrupt", // 02 + "Breakpoint", // 03 + "Overflow", // 04 + "Bound Range Exceeded", // 05 + "Invalid Opcode", // 06 + "Device Not Available", // 07 + "Double Fault", // 08 + "Coprocessor Segment Overrun", // 09 + "Invalid TSS", // 10 + "Segment Not Present", // 11 + "Stack-Segment Fault", // 12 + "General Protection Fault", // 13 + "Page Fault", // 14 + "-15", // 15 + "x87 Floating-Point Exception", // 16 + "Alignment Check", // 17 + "Machine Check", // 18 + "SIMD Floating-Point Exception", // 19 + "Virtualization Exception", // 20 + "Control Protection Exception", // 21 + "-22", // 22 + "-23", // 23 + "-24", // 24 + "-25", // 25 + "-26", // 26 + "-27", // 27 + "Hypervisor Injection Exception", // 28 + "VMM Communication Exception", // 29 + "Security Exception", // 30 + "-31" // 31 }; - void isr_handler(uint32_t vector); #endif \ No newline at end of file diff --git a/src/interrupt/isr.c b/src/interrupt/isr.c index 0d24808..40184fa 100644 --- a/src/interrupt/isr.c +++ b/src/interrupt/isr.c @@ -1,21 +1,12 @@ #include "isr.h" -#include "vga.h" #include "panic.h" - -void isr_exeption_handler(uint32_t vector) { - exception(EXCEPTIONS[vector]); - vga_print("\n"); - - for (;;) - asm volatile("hlt"); -} +#include "vga.h" void isr_handler(uint32_t vector) { if (vector <= 31) { - isr_exeption_handler(vector); + vga_print("\n"); + exception(EXCEPTIONS[vector]); + } else { + panic("Unknown Exception"); } - - vga_print("INT: "); - vga_print_hex(vector); - vga_print("\n"); } diff --git a/src/kernel/panic.c b/src/kernel/panic.c index d0819a9..5b1ce32 100644 --- a/src/kernel/panic.c +++ b/src/kernel/panic.c @@ -1,7 +1,7 @@ +#include "panic.h" #include "lib/vga_lib.h" #include "utils.h" #include "vga.h" -#include "panic.h" void panic(char *err) { vga_print("\n"); From 53b0e19c0a342e1f03c6510d4433c0e732e25056 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Sat, 5 Sep 2026 19:50:11 +0100 Subject: [PATCH 10/12] complite interupts core --- .gitignore | 5 +- build/kernel_sectors.inc | 1 - includes/{ => driver}/ps2.h | 0 includes/{ => driver}/vga.h | 0 includes/{ => interrupt}/idt.h | 1 + includes/interrupt/irq.h | 0 includes/{ => interrupt}/isr.h | 0 src/driver/pit.c | 0 src/interrupt/idt.c | 6 ++ src/interrupt/irq.asm | 149 +++++++++++++++++++++++++++++++++ src/interrupt/irq.c | 9 ++ src/kernel/kernel.c | 4 +- src/kernel/panic.c | 2 +- 13 files changed, 171 insertions(+), 6 deletions(-) delete mode 100644 build/kernel_sectors.inc rename includes/{ => driver}/ps2.h (100%) rename includes/{ => driver}/vga.h (100%) rename includes/{ => interrupt}/idt.h (96%) create mode 100644 includes/interrupt/irq.h rename includes/{ => interrupt}/isr.h (100%) create mode 100644 src/driver/pit.c create mode 100644 src/interrupt/irq.asm create mode 100644 src/interrupt/irq.c diff --git a/.gitignore b/.gitignore index 4c8eb37..954ab34 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,7 @@ dkms.conf .vscode -**.inc -build/* \ No newline at end of file + +build/* +build/*.inc \ No newline at end of file diff --git a/build/kernel_sectors.inc b/build/kernel_sectors.inc deleted file mode 100644 index 5fd6b90..0000000 --- a/build/kernel_sectors.inc +++ /dev/null @@ -1 +0,0 @@ -KERNEL_SECTORS equ 15 diff --git a/includes/ps2.h b/includes/driver/ps2.h similarity index 100% rename from includes/ps2.h rename to includes/driver/ps2.h diff --git a/includes/vga.h b/includes/driver/vga.h similarity index 100% rename from includes/vga.h rename to includes/driver/vga.h diff --git a/includes/idt.h b/includes/interrupt/idt.h similarity index 96% rename from includes/idt.h rename to includes/interrupt/idt.h index c82d138..c5ec1cd 100644 --- a/includes/idt.h +++ b/includes/interrupt/idt.h @@ -9,6 +9,7 @@ #define KERNEL_CODE_SELECTOR 0x08 extern uint32_t isr_table[256]; +extern uint32_t irq_table[16]; struct idt_entry { uint16_t offset_low; // handler address bits 0..15 diff --git a/includes/interrupt/irq.h b/includes/interrupt/irq.h new file mode 100644 index 0000000..e69de29 diff --git a/includes/isr.h b/includes/interrupt/isr.h similarity index 100% rename from includes/isr.h rename to includes/interrupt/isr.h diff --git a/src/driver/pit.c b/src/driver/pit.c new file mode 100644 index 0000000..e69de29 diff --git a/src/interrupt/idt.c b/src/interrupt/idt.c index a1bfac8..c2ae253 100644 --- a/src/interrupt/idt.c +++ b/src/interrupt/idt.c @@ -29,9 +29,15 @@ void idt_init(void) { idt_init_descriptor(); + // isr for (uint8_t i = 0; i < 32; i++) { idt_set_gate(i, isr_table[i], KERNEL_CODE_SELECTOR, IDT_INTERRUPT_GATE); } + // irq + for (uint8_t i = 32; i < 48; i++) { + idt_set_gate(i, irq_table[i - 32], KERNEL_CODE_SELECTOR, IDT_INTERRUPT_GATE); + } + idt_load(); } diff --git a/src/interrupt/irq.asm b/src/interrupt/irq.asm new file mode 100644 index 0000000..f34115f --- /dev/null +++ b/src/interrupt/irq.asm @@ -0,0 +1,149 @@ +; ============================================================ +; IRQ handlers 0-15 +; +; PIC IRQs: +; IRQ 0 -> IDT vector 32 +; IRQ 1 -> IDT vector 33 +; ... +; IRQ 15 -> IDT vector 47 +; +; The IDT uses vectors 32-47, but we pass IRQ numbers +; 0-15 to the C IRQ handler. +; ============================================================ + +[BITS 32] + + +; ============================================================ +; Export IRQ handlers and IRQ table +; ============================================================ + +global irq0 +global irq1 +global irq2 +global irq3 +global irq4 +global irq5 +global irq6 +global irq7 +global irq8 +global irq9 +global irq10 +global irq11 +global irq12 +global irq13 +global irq14 +global irq15 + +global irq_table + + +extern irq_handler + + +; ============================================================ +; IRQ macro +; +; IRQs do NOT automatically push an error code. +; +; We push: +; +; 1. dummy error code +; 2. IRQ number +; +; This gives us a predictable stack layout. +; ============================================================ + +%macro IRQ 1 + +irq%1: + + cli + + push dword 0 ; dummy error code + push dword %1 ; IRQ number: 0-15 + + jmp irq_common_stub + +%endmacro + + +; ============================================================ +; IRQ entry points +; ============================================================ + +IRQ 0 +IRQ 1 +IRQ 2 +IRQ 3 +IRQ 4 +IRQ 5 +IRQ 6 +IRQ 7 +IRQ 8 +IRQ 9 +IRQ 10 +IRQ 11 +IRQ 12 +IRQ 13 +IRQ 14 +IRQ 15 + + +; ============================================================ +; IRQ table +; +; irq_table[0] -> irq0 +; irq_table[1] -> irq1 +; ... +; irq_table[15] -> irq15 +; ============================================================ + +section .data + +irq_table: + dd irq0 + dd irq1 + dd irq2 + dd irq3 + dd irq4 + dd irq5 + dd irq6 + dd irq7 + dd irq8 + dd irq9 + dd irq10 + dd irq11 + dd irq12 + dd irq13 + dd irq14 + dd irq15 + + +; ============================================================ +; Common IRQ stub +; ============================================================ + +section .text + +irq_common_stub: + + ; Save general-purpose registers + pusha + + ; Pass pointer to interrupt frame + push esp + call irq_handler + add esp, 4 + + ; Restore general-purpose registers + popa + + ; Remove: + ; + ; 4 bytes = IRQ number + ; 4 bytes = dummy error code + ; + add esp, 8 + + iretd \ No newline at end of file diff --git a/src/interrupt/irq.c b/src/interrupt/irq.c new file mode 100644 index 0000000..84a97a4 --- /dev/null +++ b/src/interrupt/irq.c @@ -0,0 +1,9 @@ +#include "irq.h" +#include "vga.h" +#include "vga_lib.h" + +void irq_handler(uint32_t vector) { + vga_print("IRQ: "); + vga_print_hex(vector); + vga_print("\n"); +} \ No newline at end of file diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c index 245e05b..446dac9 100644 --- a/src/kernel/kernel.c +++ b/src/kernel/kernel.c @@ -20,9 +20,9 @@ void kernel_main() { idt_init(); vga_print_at_end_c("... Ok\n", GREEN); - panic("testing panics"); + asm volatile("int $0x22"); - asm volatile("int $0x24"); + panic("testing panics"); for (;;) { asm volatile("cli"); diff --git a/src/kernel/panic.c b/src/kernel/panic.c index 5b1ce32..a9e5818 100644 --- a/src/kernel/panic.c +++ b/src/kernel/panic.c @@ -1,7 +1,7 @@ #include "panic.h" -#include "lib/vga_lib.h" #include "utils.h" #include "vga.h" +#include "vga_lib.h" void panic(char *err) { vga_print("\n"); From 3a6dece8eb4f22069196eacddf75d8863f28fd87 Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Sat, 5 Sep 2026 20:06:58 +0100 Subject: [PATCH 11/12] update make file --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 534f6d8..2b5ee44 100644 --- a/Makefile +++ b/Makefile @@ -111,6 +111,12 @@ run: $(OS_BIN) -m 512M \ -serial stdio +setup: + @if ! docker image inspect cc:latest >/dev/null 2>&1; then \ + docker build -t cc:latest .; \ + fi + $(MAKE) + debug: $(OS_BIN) qemu-system-i386 \ From 79a44379b49aa76ada7529e5a93b8561bdc31aeb Mon Sep 17 00:00:00 2001 From: Ox03bb Date: Sat, 5 Sep 2026 20:09:11 +0100 Subject: [PATCH 12/12] fix harcoded DOCKER_IMAGE name --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2b5ee44..aa320e7 100644 --- a/Makefile +++ b/Makefile @@ -112,8 +112,8 @@ run: $(OS_BIN) -serial stdio setup: - @if ! docker image inspect cc:latest >/dev/null 2>&1; then \ - docker build -t cc:latest .; \ + @if ! docker image inspect $(DOCKER_IMAGE):latest >/dev/null 2>&1; then \ + docker build -t $(DOCKER_IMAGE):latest .; \ fi $(MAKE)