Newer
Older
tree-os / src / interrupts / interrupts.c
@lukas lukas on 16 Jul 2021 903 bytes add interrupts
#include <interrupts.h>
#include <_stdio.h>
#include <alloc.h>

IDTR idtr;
IDTEntry* entries;
void* buffer;

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

void testInterrupt() {
    printf("interrupt!\n");
}

void initInterrupts() {
    buffer = malloc(sizeof(IDTEntry) * 257);
    entries = (IDTEntry*) (((int) buffer + sizeof(IDTEntry)) & -1 ^ 0x0F);
    idtr.limit = sizeof(IDTEntry) * 256 - 1;
    idtr.base = entries;
    for (int i = 0; i < 256; i++) {
        setInterrupt(i, testInterrupt, 0x8E);
    }
    __asm__ volatile ("lidt %0" : : "memory"(idtr));
    __asm__ volatile ("sti");
}