From e93cf7db3c6a941f93a3a76dfd56a8f4d24d5d77 Mon Sep 17 00:00:00 2001 From: Arnau478 Date: Sat, 18 Jun 2022 19:19:03 +0200 Subject: [PATCH] APIC timer driver --- src/kernel/arch/i686/isr.c | 8 ++++++++ src/kernel/arch/i686/pic.c | 4 ++-- src/kernel/arch/i686/pic.h | 5 +++++ src/kernel/drivers/timer.c | 11 +++++++++++ src/kernel/drivers/timer.h | 3 +++ src/kernel/main.c | 3 ++- 6 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/kernel/drivers/timer.c create mode 100644 src/kernel/drivers/timer.h diff --git a/src/kernel/arch/i686/isr.c b/src/kernel/arch/i686/isr.c index d31fd15..b6d822b 100644 --- a/src/kernel/arch/i686/isr.c +++ b/src/kernel/arch/i686/isr.c @@ -57,6 +57,14 @@ void i686_isr_initialize(){ void __attribute__((cdecl)) i686_isr_handler(registers *regs){ if(g_isr_handlers[regs->interrupt] != NULL){ g_isr_handlers[regs->interrupt](regs); + + // Send EOI to PIC if necessary + if(regs->interrupt >= PIC1_VEC_OFFSET && regs->interrupt < PIC1_VEC_OFFSET+8){ + i686_outb(PIC1_CMD_PORT, PIC_EOI); + } + else if(regs->interrupt >= PIC2_VEC_OFFSET && regs->interrupt < PIC2_VEC_OFFSET+8){ + i686_outb(PIC2_CMD_PORT, PIC_EOI); + } } else if(regs->interrupt >= 32){ printf("Unhandled interrupt %i\n", regs->interrupt); diff --git a/src/kernel/arch/i686/pic.c b/src/kernel/arch/i686/pic.c index 105970e..8e32dbc 100644 --- a/src/kernel/arch/i686/pic.c +++ b/src/kernel/arch/i686/pic.c @@ -14,8 +14,8 @@ void i686_pic_initialize(){ i686_outb(PIC2_CMD_PORT, 0x11); // PIC2 // ICW2: Remap IRQs - i686_outb(PIC1_DATA_PORT, 0x20); // PIC1 remapped to 0x20 (32) - i686_outb(PIC2_DATA_PORT, 0x28); // PIC2 remapped to 0x28 (40) + i686_outb(PIC1_DATA_PORT, PIC1_VEC_OFFSET); // PIC1 remapped to PIC1_VEC_OFFSET + i686_outb(PIC2_DATA_PORT, PIC2_VEC_OFFSET); // PIC2 remapped to PIC2_VEC_OFFSET // ICW3: Cascade settings i686_outb(PIC1_DATA_PORT, 0x04); // PIC1 is told that slave PIC is at IRQ2 diff --git a/src/kernel/arch/i686/pic.h b/src/kernel/arch/i686/pic.h index 12dbada..24aad8b 100644 --- a/src/kernel/arch/i686/pic.h +++ b/src/kernel/arch/i686/pic.h @@ -5,4 +5,9 @@ #define PIC2_CMD_PORT 0xA0 #define PIC2_DATA_PORT 0xA1 +#define PIC1_VEC_OFFSET 0x20 +#define PIC2_VEC_OFFSET 0x28 + +#define PIC_EOI 0x20 + void i686_pic_initialize(); diff --git a/src/kernel/drivers/timer.c b/src/kernel/drivers/timer.c new file mode 100644 index 0000000..ff4e7dd --- /dev/null +++ b/src/kernel/drivers/timer.c @@ -0,0 +1,11 @@ +#include "timer.h" +#include "../arch/i686/isr.h" +#include "../stdio.h" + +static void timer_handler(registers *regs){ + printf("TICK\n"); +} + +void timer_initialize(){ + i686_isr_register_handler(IRQ(0), timer_handler); +} diff --git a/src/kernel/drivers/timer.h b/src/kernel/drivers/timer.h new file mode 100644 index 0000000..4f33b4d --- /dev/null +++ b/src/kernel/drivers/timer.h @@ -0,0 +1,3 @@ +#pragma once + +void timer_initialize(); diff --git a/src/kernel/main.c b/src/kernel/main.c index 4d5dee2..ec2467e 100644 --- a/src/kernel/main.c +++ b/src/kernel/main.c @@ -1,13 +1,14 @@ #include #include "stdio.h" #include "hal/hal.h" +#include "drivers/timer.h" void __attribute__((cdecl)) kmain(uint64_t magic, uint64_t addr){ hal_initialize(); + timer_initialize(); puts("\x1b[33mWARNING\x1b[0m"); printf(": amazing %s ahead!\n", "math"); printf("%i+%i=%i\n", 1, 1, 2); - printf("0/0=%i", 0/0); for(;;); }