49 lines
1.2 KiB
C
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));
|
|
}
|