lenochka/kernel/idt.c
2019-03-29 00:27:42 +02:00

91 lines
2.3 KiB
C

#include "idt.h"
#include "stdlib.h"
extern void int0_handler();
extern void int1_handler();
extern void int2_handler();
extern void int3_handler();
extern void int4_handler();
extern void int5_handler();
extern void int6_handler();
extern void int7_handler();
extern void int8_handler();
extern void int9_handler();
extern void int10_handler();
extern void int11_handler();
extern void int12_handler();
extern void int13_handler();
extern void int14_handler();
extern void int15_handler();
extern void int16_handler();
extern void int17_handler();
extern void int18_handler();
extern void int19_handler();
extern void int20_handler();
extern void int21_handler();
extern void int22_handler();
extern void int23_handler();
extern void int24_handler();
extern void int25_handler();
extern void int26_handler();
extern void int27_handler();
extern void int28_handler();
extern void int29_handler();
extern void int30_handler();
extern void int31_handler();
static u32 idt_table[1024];
static inthandler_t inthandlers[256];
static inthandler_t handlers[32] = {
int0_handler,int1_handler,int2_handler,int3_handler,
int4_handler,int5_handler,int6_handler,int7_handler,
int8_handler,int9_handler,int10_handler,int11_handler,
int12_handler,int13_handler,int14_handler,int15_handler,
int16_handler,int17_handler,int18_handler,int19_handler,
int20_handler,int21_handler,int22_handler,int23_handler,
int24_handler,int25_handler,int26_handler,int27_handler,
int28_handler,int29_handler,int30_handler,int31_handler
};
static u64 cur_handler = 0;
void idt_set_handler(u8 idx,inthandler_t hndr,u8 type)
{
u32* item = (u32*)(&idt_table[idx<<2]);
u64 addr;
if(cur_handler == 32)
{
kprintf("idt_set_handler: no free handlers!\n");
return;
}
inthandlers[cur_handler] = hndr;
addr = (u64)handlers[cur_handler++];
item[0] = (OS_CODE_SELECTOR<<16)|(addr&0xFFFF);
item[1] = (((addr>>16)&0xFFFF)<<16)|(1<<15)|((type&0x0F)<<8);
item[2] = (addr>>32);
item[3] = 0;
}
void idt_call_handler(u8 handler)
{
if(inthandlers[handler])
{
inthandlers[handler]();
}
}
extern void _idt_install(void* table,u64 limit);
void idt_install()
{
kmemzero(idt_table,sizeof(idt_table));
kmemzero(inthandlers,sizeof(inthandlers));
_idt_install(idt_table,sizeof(idt_table));
}
void idt_enable_interrupts()
{
__asm("sti");
}