#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"); }