/* *'freely' inspired by http://jojo.ouvaton.org/dossiers/boot_sector/tutorial02.html * (actually, that's mostly copied, with minor compilation fixes) */ #include "kernel.h" #include "klibc.h" #define IDTBASE 0 /* GDT Physical address */ #define IDTSIZE 256 /* Max descriptor count */ #define INTGATE 0x8E00 /* Interruptions */ #define TRAPGATE 0x8F00 /* Syscalls */ #define TASKGATE 0x8500 /* Task switching */ /* segment descriptor */ struct idtdesc { u16 offset0_15; u16 select; u16 type; u16 offset16_31; } __attribute__ ((packed)); /* IDTR register */ struct idtr { u16 limite; u32 base; } __attribute__ ((packed)); struct idtr kidtr; /* IDT table */ struct idtdesc kidt[IDTSIZE] = {{0, 0, 0, 0}}; /* pointer on a free IDT entry */ unsigned int kidtptr = 0; void default_int(void); void k_int0(void); void k_int1(void); void k_int2(void); void k_int3(void); void k_int4(void); void k_int5(void); void k_int6(void); void k_int7(void); void k_int8(void); void k_int9(void); void k_int10(void); void k_int11(void); void k_int12(void); void k_int13(void); void k_int14(void); void k_int15(void); void k_int16(void); void k_int17(void); void k_int18(void); void k_irq0(void); void k_irq1(void); void k_irq2(void); void k_irq3(void); void k_irq4(void); void k_irq5(void); void k_irq6(void); void k_irq7(void); void k_irq8(void); void init_idt_desc(u32 offset, u16 select, u16 type, struct idtdesc* desc) { desc->offset0_15 = (offset & 0xffff); desc->select = select; desc->type = type; desc->offset16_31 = (offset & 0xffff0000) >> 16; return; } void add_idt_desc(struct idtdesc desc) { kidt[kidtptr++] = desc; return; } void init_idt(void) { struct idtdesc desc; int i; for(i=0;i