Files
frostbyte/src/idt.c
T

49 lines
1.2 KiB
C

#include "idt.h"
#include "types.h"
typedef struct IdtEntry {
uint16 offsetLow;
uint16 selector;
uint8 ist;
uint8 typeAttr;
uint16 offsetMid;
uint32 offsetHigh;
uint32 reserved;
} __attribute__((packed)) IdtEntry;
typedef struct IdtPointer {
uint16 limit;
uint64 base;
} __attribute__((packed)) IdtPointer;
static IdtEntry idtEntries[256];
static IdtPointer idtPointer;
extern void* isrStubTable[];
extern void isrStub128(void);
static void setGate(int vector, void* handler, uint8 typeAttr)
{
uint64 address = (uint64)handler;
idtEntries[vector].offsetLow = (uint16)(address & 0xFFFF);
idtEntries[vector].selector = 0x08;
idtEntries[vector].ist = 0;
idtEntries[vector].typeAttr = typeAttr;
idtEntries[vector].offsetMid = (uint16)((address >> 16) & 0xFFFF);
idtEntries[vector].offsetHigh = (uint32)((address >> 32) & 0xFFFFFFFF);
idtEntries[vector].reserved = 0;
}
void idtInit(void)
{
for (int vector = 0; vector < 48; vector++)
setGate(vector, isrStubTable[vector], 0x8E);
setGate(0x80, (void*)isrStub128, 0xEE);
idtPointer.limit = (uint16)(sizeof(idtEntries) - 1);
idtPointer.base = (uint64)&idtEntries;
__asm__ volatile("lidt %0" : : "m"(idtPointer));
}