From 7bb5e0d16c435c98330caeb8b2c1499c72f1e6de Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Sat, 18 Jun 2022 03:56:45 +0200 Subject: [PATCH] Finished and fixed ISR+IDT --- src/kernel/arch/i686/idt.c | 4 ++-- src/kernel/arch/i686/io.asm | 5 +++++ src/kernel/arch/i686/io.h | 2 ++ src/kernel/arch/i686/isr.c | 24 +++++++++++++++++++++--- src/kernel/arch/i686/isr.h | 2 +- src/kernel/hal/hal.c | 2 ++ src/kernel/main.c | 3 ++- 7 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/kernel/arch/i686/idt.c b/src/kernel/arch/i686/idt.c index 78002a3..944c0ca 100644 --- a/src/kernel/arch/i686/idt.c +++ b/src/kernel/arch/i686/idt.c @@ -7,12 +7,12 @@ typedef struct{ uint8_t reserved; uint8_t flags; uint16_t base_high; -} idt_entry; +} __attribute__((packed)) idt_entry; typedef struct{ uint16_t limit; idt_entry *ptr; -} idt_descriptor; +} __attribute__((packed)) idt_descriptor; idt_entry g_idt[256]; diff --git a/src/kernel/arch/i686/io.asm b/src/kernel/arch/i686/io.asm index e31e1fe..8b2b2e8 100644 --- a/src/kernel/arch/i686/io.asm +++ b/src/kernel/arch/i686/io.asm @@ -29,3 +29,8 @@ i686_outw: mov ax, [esp + 8] out dx, ax ret + +global i686_panic +i686_panic: + cli + hlt diff --git a/src/kernel/arch/i686/io.h b/src/kernel/arch/i686/io.h index 9e919e7..54e63a8 100644 --- a/src/kernel/arch/i686/io.h +++ b/src/kernel/arch/i686/io.h @@ -4,3 +4,5 @@ uint8_t __attribute__((cdecl)) i686_inb(uint16_t port); void __attribute__((cdecl)) i686_outb(uint16_t port, uint8_t value); uint16_t __attribute__((cdecl)) i686_inw(uint16_t port); void __attribute__((cdecl)) i686_outw(uint16_t port, uint16_t value); + +void __attribute__((cdecl)) i686_panic(); diff --git a/src/kernel/arch/i686/isr.c b/src/kernel/arch/i686/isr.c index 2279fc8..4850a38 100644 --- a/src/kernel/arch/i686/isr.c +++ b/src/kernel/arch/i686/isr.c @@ -1,5 +1,8 @@ +#include #include "isr.h" #include "../../stdio.h" +#include "idt.h" +#include "io.h" static isr_handler g_isr_handlers[256]; @@ -43,11 +46,26 @@ void i686_isr_initialize_gates(); void i686_isr_initialize(){ i686_isr_initialize_gates(); - // Remap PIC + for(int i = 0; i < 256; i++){ + i686_idt_enable_gate(i); + } } -void i686_isr_handler(registers *regs){ - printf("Interrupt %i\n", regs->interrupt); +void __attribute__((cdecl)) i686_isr_handler(registers *regs){ + if(g_isr_handlers[regs->interrupt] != NULL){ + g_isr_handlers[regs->interrupt](regs); + } + else if(regs->interrupt >= 32){ + printf("Unhandled interrupt %i\n", regs->interrupt); + } + else{ + printf("Unhandled interrupt %i %s\n", regs->interrupt, g_exceptions[regs->interrupt]); + printf(" eax=%i ebx=%i ecx=%i edx=%i esi=%i edi=%i\n", regs->eax, regs->ebx, regs->ecx, regs->edx, regs->esi, regs->edi); + printf(" esp=%i ebp=%i eip=%i eflags=%i cs=%i ds=%i ss=%i\n", regs->esp, regs->ebp, regs->eip, regs->eflags, regs->cs, regs->ds, regs->ss); + printf(" interrupt=%i errorcode=%i\n", regs->interrupt, regs->error); + printf("!!! KERNEL PANIC !!!\n"); + i686_panic(); + } } void i686_isr_register_handler(int interrupt, isr_handler handler){ diff --git a/src/kernel/arch/i686/isr.h b/src/kernel/arch/i686/isr.h index a9ed062..7bb26b5 100644 --- a/src/kernel/arch/i686/isr.h +++ b/src/kernel/arch/i686/isr.h @@ -11,7 +11,7 @@ typedef struct{ uint32_t eip, cs, eflags, esp, ss; } __attribute__((packed)) registers; -typedef void (*isr_handler)(registers regs); +typedef void (*isr_handler)(registers *regs); void i686_isr_initialize(); void i686_isr_register_handler(int interrupt, isr_handler handler); diff --git a/src/kernel/hal/hal.c b/src/kernel/hal/hal.c index e995c42..57345cd 100644 --- a/src/kernel/hal/hal.c +++ b/src/kernel/hal/hal.c @@ -1,8 +1,10 @@ #include "hal.h" #include "../arch/i686/gdt.h" #include "../arch/i686/idt.h" +#include "../arch/i686/isr.h" void hal_initialize(){ i686_gdt_initialize(); i686_idt_initialize(); + i686_isr_initialize(); } diff --git a/src/kernel/main.c b/src/kernel/main.c index 44a9891..4d5dee2 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -8,5 +8,6 @@ void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ puts("\x1b[33mWARNING\x1b[0m"); printf(": amazing %s ahead!\n", "math"); printf("%i+%i=%i\n", 1, 1, 2); - for(;;); // Halt here + printf("0/0=%i", 0/0); + for(;;); }