void init_irq() { remap_irq(); idt_set_gate(32, (unsigned)irq0, 0x08, 0x8E); idt_set_gate(33, (unsigned)irq1, 0x08, 0x8E); idt_set_gate(34, (unsigned)irq2, 0x08, 0x8E); idt_set_gate(35, (unsigned)irq3, 0x08, 0x8E); idt_set_gate(36, (unsigned)irq4, 0x08, 0x8E); idt_set_gate(37, (unsigned)irq5, 0x08, 0x8E); idt_set_gate(38, (unsigned)irq6, 0x08, 0x8E); idt_set_gate(39, (unsigned)irq7, 0x08, 0x8E); idt_set_gate(40, (unsigned)irq8, 0x08, 0x8E); idt_set_gate(41, (unsigned)irq9, 0x08, 0x8E); idt_set_gate(42, (unsigned)irq10, 0x08, 0x8E); idt_set_gate(43, (unsigned)irq11, 0x08, 0x8E); idt_set_gate(44, (unsigned)irq12, 0x08, 0x8E); idt_set_gate(45, (unsigned)irq13, 0x08, 0x8E); idt_set_gate(46, (unsigned)irq14, 0x08, 0x8E); idt_set_gate(47, (unsigned)irq15, 0x08, 0x8E); }
// Name: initialize_idt // Description: This function will create interrupt descript table and loads it to IDTR // Parameters: - // Return: - void initialize_idt() { struct idt_table_entry nullEntry; int i = 0; idtptr.limit = (sizeof(struct idt_table_entry)*256) - 1; idtptr.base = (unsigned int)&idt; nullEntry = idtDescriptorToidtEntry(getidtDescriptor(0,0,0,0,0,0,0,0,0)); for(i = 0; i < 255; i++) idt[i] = nullEntry; idt[0] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_0, 1, 1, 0, 0, 0,6, 0 )); idt[1] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_1, 1, 1, 0, 0, 0,6, 0 )); idt[2] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_2, 1, 1, 0, 0, 0,6, 0 )); idt[3] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_3, 1, 1, 0, 0, 0,6, 0 )); idt[4] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_4, 1, 1, 0, 0, 0,6, 0 )); idt[5] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_5, 1, 1, 0, 0, 0,6, 0 )); idt[6] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_6, 1, 1, 0, 0, 0,6, 0 )); idt[7] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_7, 1, 1, 0, 0, 0,6, 0 )); idt[8] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_8, 1, 1, 0, 0, 0,6, 0 )); idt[9] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_9, 1, 1, 0, 0, 0,6, 0 )); idt[10] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_10, 1, 1, 0, 0, 0,6, 0 )); idt[11] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_11, 1, 1, 0, 0, 0,6, 0 )); idt[12] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_12, 1, 1, 0, 0, 0,6, 0 )); idt[13] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_13, 1, 1, 0, 0, 0,6, 0 )); idt[14] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_14, 1, 1, 0, 0, 0,6, 0 )); idt[15] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_15, 1, 1, 0, 0, 0,6, 0 )); idt[16] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_16, 1, 1, 0, 0, 0,6, 0 )); idt[17] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_17, 1, 1, 0, 0, 0,6, 0 )); idt[18] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_18, 1, 1, 0, 0, 0,6, 0 )); idt[19] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_19, 1, 1, 0, 0, 0,6, 0 )); idt[20] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_20, 1, 1, 0, 0, 0,6, 0 )); idt[21] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_21, 1, 1, 0, 0, 0,6, 0 )); idt[22] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_22, 1, 1, 0, 0, 0,6, 0 )); idt[23] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_23, 1, 1, 0, 0, 0,6, 0 )); idt[24] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_24, 1, 1, 0, 0, 0,6, 0 )); idt[25] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_25, 1, 1, 0, 0, 0,6, 0 )); idt[26] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_26, 1, 1, 0, 0, 0,6, 0 )); idt[27] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_27, 1, 1, 0, 0, 0,6, 0 )); idt[28] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_28, 1, 1, 0, 0, 0,6, 0 )); idt[29] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_29, 1, 1, 0, 0, 0,6, 0 )); idt[30] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_30, 1, 1, 0, 0, 0,6, 0 )); idt[31] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_handler_31, 1, 1, 0, 0, 0,6, 0 )); remap_irq(); idt[32] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_0, 1, 1, 0, 0, 0,6, 0 )); idt[33] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_1, 1, 1, 0, 0, 0,6, 0 )); idt[34] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_2, 1, 1, 0, 0, 0,6, 0 )); idt[35] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_3, 1, 1, 0, 0, 0,6, 0 )); idt[36] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_4, 1, 1, 0, 0, 0,6, 0 )); idt[37] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_5, 1, 1, 0, 0, 0,6, 0 )); idt[38] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_6, 1, 1, 0, 0, 0,6, 0 )); idt[39] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_7, 1, 1, 0, 0, 0,6, 0 )); idt[40] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_8, 1, 1, 0, 0, 0,6, 0 )); idt[41] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_9, 1, 1, 0, 0, 0,6, 0 )); idt[42] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_10, 1, 1, 0, 0, 0,6, 0 )); idt[43] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_11, 1, 1, 0, 0, 0,6, 0 )); idt[44] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_12, 1, 1, 0, 0, 0,6, 0 )); idt[45] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_13, 1, 1, 0, 0, 0,6, 0 )); idt[46] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_14, 1, 1, 0, 0, 0,6, 0 )); idt[47] = idtDescriptorToidtEntry(getidtDescriptor(0x08, (unsigned int)interrupt_request_15, 1, 1, 0, 0, 0,6, 0 )); load_idt(); __asm__ __volatile__("sti"); }