Newer
Older
tree-os / src / kernel / drivers / interrupts / interrupts.c
@lukas lukas on 15 May 2022 720 bytes adjust alloc for paging
#include <alloc.h>
#include <exceptions.h>
#include <interrupts.h>
#include <irqs.h>
#include <ports.h>
#include <stdio.h>
#include <task.h>
#include <timer.h>

IDTR idtr;
IDTEntry entries[256];

void setInterrupt(uint8_t vector, void *callback) {
    IDTEntry *descriptor = &entries[vector];
    descriptor->isr_low = (uintptr_t)callback & 0xFFFF;
    descriptor->codeSegment = 0x08;
    descriptor->attributes = 0x8E;
    descriptor->isr_high = (uintptr_t)callback >> 16;
    descriptor->reserved = 0;
}

void setupInterrupts() {
    idtr.limit = sizeof(IDTEntry) * 256 - 1;
    idtr.base = (uint32_t)(uintptr_t)entries;
    setupExceptions();
    setupIRQs();
    asm("lidt %0" : : "memory"(idtr));
    asm("sti");
}