feat(cpu): install IDT with exception and syscall gate handling
This commit is contained in:
1 parent
4843406bf3
commit
e5c4139e49
4 files changed
+145
No files matched your search
@@ -0,0 +1,48 @@
|
||||
#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));
|
||||
}
|
||||
Reference in new issue
Block a user