diff --git a/src/headers/interrupts.h b/src/headers/interrupts.h index 0df0755..334a2db 100644 --- a/src/headers/interrupts.h +++ b/src/headers/interrupts.h @@ -39,6 +39,10 @@ typedef struct { uint32_t int_no, err_code; uint32_t eip, cs, eflags, useresp, ss; } INT_registers_t; +typedef struct { + uint8_t inuse; + void* callback; +} IRQ_entry_t; inline void PIC_sendEOI(uint8_t irq) { if (irq >= 8) { // slave also needs EOI @@ -52,6 +56,7 @@ void INT_exhand(INT_registers_t regs); void INT_IRQ(uint8_t IRQ, INT_registers_t regs); void idt_set_descriptor(uint8_t vector, void* isr, uint8_t flags); void idt_init(); +void IRQ_registerhandler(uint8_t vector, void* callback); __attribute__((aligned(0x10))) extern idt_entry_t idt[256]; @@ -59,4 +64,5 @@ extern idtr_t idtr; extern void* isr_stub_table[]; extern void* irq_stub_table[]; extern uint8_t INT_vectors[IDT_MAX_DESCRIPTORS]; -extern char *exception_messages[]; \ No newline at end of file +extern char *exception_messages[]; +extern IRQ_entry_t IRQ_entries[16]; \ No newline at end of file diff --git a/src/kernel/entry.c b/src/kernel/entry.c index d67c0a1..491711b 100644 --- a/src/kernel/entry.c +++ b/src/kernel/entry.c @@ -73,5 +73,16 @@ void kernel_main(struct multiboot_info* header, uint32_t magic) { asm volatile("sti"); kputstr("OK\n"); - + while (1) {} + + kputstr("Initializing Timer: "); + uint32_t divisor = 1193180 / 1000; + uint8_t low = (uint8_t)(divisor & 0xFF); + uint8_t high = (uint8_t)( (divisor >> 8) & 0xFF); + outb(0x43, 0x36); + outb(0x40, low); + outb(0x40, high); + kputstr("OK\n"); + + while (1) {} } \ No newline at end of file diff --git a/src/kernel/interrupts.c b/src/kernel/interrupts.c index a79ea21..6a751d5 100644 --- a/src/kernel/interrupts.c +++ b/src/kernel/interrupts.c @@ -40,6 +40,7 @@ char *exception_messages[] = { "Reserved", "Reserved" }; +IRQ_entry_t IRQ_entries[16]; void PIC_remap(int offset1, int offset2) { outb(PIC1_COMMAND, ICW1_INIT | ICW1_ICW4); // starts the initialization sequence (in cascade mode) @@ -72,8 +73,10 @@ void INT_exhand(INT_registers_t regs) { strcon(msg,temp); kpanic(msg); } -void INT_IRQ(uint8_t IRQ, INT_registers_t regs) { - +void INT_IRQ(INT_registers_t regs) { + if (IRQ_entries[regs.int_no].inuse) { + (void (*)(INT_registers_t))IRQ_entries[regs.int_no].callback(regs); + } } void idt_init() { idtr.base = (uint32_t)&idt[0]; @@ -84,4 +87,8 @@ void idt_init() { } __asm__ volatile ("lidt %0" : : "m"(idtr)); // load the new IDT +} +void IRQ_registerhandler(uint8_t vector, void* callback) { + IRQ_entries[vector].inuse = 1; + IRQ_entries[vector].callback = callback; } \ No newline at end of file diff --git a/src/kernel/stdlib.c b/src/kernel/stdlib.c index fb1b145..e3f5182 100644 --- a/src/kernel/stdlib.c +++ b/src/kernel/stdlib.c @@ -26,27 +26,29 @@ uint8_t uitoa32(uint32_t x, char* str) { } void memcopy(void* dest, void* src, size_t size) { for (size_t i=0;i