1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
#include "idt.h" #include "string.h"
extern void idt_flush(u32); struct idt_descriptor idt[256]; struct idtr_struct idtr;
void idt_set_descriptor(int num,u32 offset,u16 seg,u8 flags);
void init_idt(){ idtr.limit = sizeof(struct idt_descriptor) * 256 - 1; idtr.base = (u32)&idt;
bzero(&idt,sizeof(struct idt_descriptor) *256); idt_set_descriptor( 0, (u32)isr0, 0x08, 0x8E); idt_set_descriptor( 1, (u32)isr1, 0x08, 0x8E); idt_set_descriptor( 2, (u32)isr2, 0x08, 0x8E); idt_set_descriptor( 3, (u32)isr3, 0x08, 0x8E); idt_set_descriptor( 4, (u32)isr4, 0x08, 0x8E); idt_set_descriptor( 5, (u32)isr5, 0x08, 0x8E); idt_set_descriptor( 6, (u32)isr6, 0x08, 0x8E); idt_set_descriptor( 7, (u32)isr7, 0x08, 0x8E); idt_set_descriptor( 8, (u32)isr8, 0x08, 0x8E); idt_set_descriptor( 9, (u32)isr9, 0x08, 0x8E); idt_set_descriptor(10, (u32)isr10, 0x08, 0x8E); idt_set_descriptor(11, (u32)isr11, 0x08, 0x8E); idt_set_descriptor(12, (u32)isr12, 0x08, 0x8E); idt_set_descriptor(13, (u32)isr13, 0x08, 0x8E); idt_set_descriptor(14, (u32)isr14, 0x08, 0x8E); idt_set_descriptor(15, (u32)isr15, 0x08, 0x8E); idt_set_descriptor(16, (u32)isr16, 0x08, 0x8E); idt_set_descriptor(17, (u32)isr17, 0x08, 0x8E); idt_set_descriptor(18, (u32)isr18, 0x08, 0x8E); idt_set_descriptor(19, (u32)isr19, 0x08, 0x8E); idt_set_descriptor(20, (u32)isr20, 0x08, 0x8E); idt_set_descriptor(21, (u32)isr21, 0x08, 0x8E); idt_set_descriptor(22, (u32)isr22, 0x08, 0x8E); idt_set_descriptor(23, (u32)isr23, 0x08, 0x8E); idt_set_descriptor(24, (u32)isr24, 0x08, 0x8E); idt_set_descriptor(25, (u32)isr25, 0x08, 0x8E); idt_set_descriptor(26, (u32)isr26, 0x08, 0x8E); idt_set_descriptor(27, (u32)isr27, 0x08, 0x8E); idt_set_descriptor(28, (u32)isr28, 0x08, 0x8E); idt_set_descriptor(29, (u32)isr29, 0x08, 0x8E); idt_set_descriptor(30, (u32)isr30, 0x08, 0x8E); idt_set_descriptor(31, (u32)isr31, 0x08, 0x8E); idt_flush((u32)&idtr); }
void idt_set_descriptor(int num,u32 offset,u16 seg,u8 flags){ idt[num].offset_low = offset & 0xFFFF; idt[num].offset_high = (offset >> 16 ) &0xFFFF;
idt[num].seg = seg; idt[num].zero = 0; idt[num].flags = flags; }
|