INITCODE void arch_faults_init(void) { int slot, ist; uint8_t dpl; for (slot = 0; slot < IDT_NUM_FAULTS; slot++) { /* allow jump to the breakpoint handler from user space */ dpl = (slot == FLT_BP) ? SEG_DPL_USER : SEG_DPL_KERNEL; ist = get_ist_by_fault(slot); idt_install_gate(slot, SEG_TYPE_INTR, dpl, GET_FAULTS_TABLE_ENTRY(slot), ist); } SET_FAULT_HANDLER(FLT_DE, FH_devide_by_zero); SET_FAULT_HANDLER(FLT_DB, FH_debug); SET_FAULT_HANDLER(FLT_NMI, FH_nmi); SET_FAULT_HANDLER(FLT_BP, FH_breakpoint); SET_FAULT_HANDLER(FLT_OF, FH_overflow); SET_FAULT_HANDLER(FLT_BR, FH_bound_range); SET_FAULT_HANDLER(FLT_UD, FH_invalid_opcode); SET_FAULT_HANDLER(FLT_NM, FH_device_not_avail); SET_FAULT_HANDLER(FLT_DF, FH_double_fault); SET_FAULT_HANDLER(FLT_TS, FH_invalid_tss); SET_FAULT_HANDLER(FLT_NP, FH_segment_not_present); SET_FAULT_HANDLER(FLT_SS, FH_stack_exception); SET_FAULT_HANDLER(FLT_GP, FH_general_protection_fault); SET_FAULT_HANDLER(FLT_PF, FH_page_fault); SET_FAULT_HANDLER(FLT_MF, FH_floating_point_exception); SET_FAULT_HANDLER(FLT_AC, FH_alignment_check); SET_FAULT_HANDLER(FLT_MC, FH_machine_check); SET_FAULT_HANDLER(FLT_XF, FH_simd_floating_point); SET_FAULT_HANDLER(FLT_SX, FH_security_exception); init_reserved_faults(); }
/** * Installs the Syscall Handler */ void syscall_init(void) { /* Install interrupt at vector 0x80 */ idt_install_gate(0x80, IDT_DESC_PRESENT | IDT_DESC_BIT32 | IDT_DESC_RING3, (GDT_KERNEL_CODE << 3), (int_handler_t)syscall_irq_handler); }
void exception_init() { //Hardware exceptions x86 idt_install_gate(0, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler0); idt_install_gate(1, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler1); idt_install_gate(2, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler2); idt_install_gate(3, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler3); idt_install_gate(4, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler4); idt_install_gate(5, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler5); idt_install_gate(6, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler6); idt_install_gate(7, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler7); idt_install_gate(8, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler8); idt_install_gate(9, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler9); idt_install_gate(10, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler10); idt_install_gate(11, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler11); idt_install_gate(12, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler12); idt_install_gate(13, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler13); idt_install_gate(14, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler14); idt_install_gate(15, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler15); idt_install_gate(16, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler16); idt_install_gate(17, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler17); idt_install_gate(18, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler18); idt_install_gate(19, (uint16_t)(IDT_DESC_PRESENT | IDT_DESC_BIT32), (GDT_KERNEL_CODE << 3), (irq_handler)isr_handler19); }