#include #include extern void isr0(); extern void isr1(); extern void isr2(); extern void isr3(); extern void isr4(); extern void isr5(); extern void isr6(); extern void isr7(); extern void isr8(); extern void isr9(); extern void isr10(); extern void isr11(); extern void isr12(); extern void isr13(); extern void isr14(); extern void isr15(); extern void isr16(); extern void isr17(); extern void isr18(); extern void isr19(); extern void isr20(); extern void isr21(); extern void isr22(); extern void isr23(); extern void isr24(); extern void isr25(); extern void isr26(); extern void isr27(); extern void isr28(); extern void isr29(); extern void isr30(); extern void isr31(); extern void isr32(); extern void isr33(); extern void isr34(); extern void isr35(); extern void isr36(); extern void isr37(); extern void isr38(); extern void isr39(); extern void isr40(); extern void isr41(); extern void isr42(); extern void isr43(); extern void isr44(); extern void isr45(); extern void isr46(); extern void isr47(); extern void isr48(); extern void isr49(); extern void isr80(); char *exception_messages[] = { "Division By Zero", "Debug", "Non Maskable Interrupt", "Breakpoint", "Into Detected Overflow", "Out of Bounds", "Invalid Opcode", "No Coprocessor", "Double Fault", "Coprocessor Segment Overrun", "Bad TSS", "Segment Not Present", "Stack Fault", "General Protection Fault", "Page Fault", "Unknown Interrupt", "Coprocessor Fault", "Alignment Check", "Machine Check", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved" }; struct idt_entry { unsigned short base_lo; unsigned short sel; unsigned char always0; unsigned char flags; unsigned short base_hi; } __attribute__((packed)); struct idt_ptr { unsigned short limit; unsigned int base; } __attribute__((packed)); struct idt_entry idt[256]; struct idt_ptr idtp; void idt_set_gate(unsigned char num, unsigned long base, unsigned short sel, unsigned char flags) { idt[num].base_lo = (base & 0xFFFF); idt[num].base_hi = (base >> 16) & 0xFFFF; idt[num].sel = sel; idt[num].always0 = 0; idt[num].flags = flags; } void bluescreen(struct cpu_state *cpu) { color = 0x1F; clear_screen(); kprintf("Es wurde ein schwerer Fehler festgestellt!\n" "LF OS wurde beendet, um den Computer vor weiteren Schaeden zu bewahren.\n\n" "Im folgenden finden Sie einige Informationen:\n" "================================================================================\n" "LF OS Version: 1.0 Alpha 5 / Kernel 2\n" "CPU-Register:\n" "EAX: %d 0x%x EBX: %d 0x%x ECX: %d 0x%x EDX: %d 0x%x\n" "ESI: %d 0x%x EDI: %d 0x%x EBP: %d 0x%x ESP: %d 0x%x\n" "EIP: %d 0x%x EFLAGS: %d 0x%x\n" "CS : %d 0x%x SS : %d 0x%x\n\n" "Exception: %d (%s)\n" "Errorcode: %d 0x%x\n" "Tasks: %d\n" "================================================================================\n" "Last OpCode: %xh\n" "Last Task : %s\n", cpu->eax, cpu->eax, cpu->ebx, cpu->ebx, cpu->ecx, cpu->ecx, cpu->edx, cpu->edx, cpu->esi, cpu->esi, cpu->edi, cpu->edi, cpu->ebp, cpu->ebp, cpu->esp, cpu->esp, cpu->eip, cpu->eip, cpu->eflags, cpu->eflags, cpu->cs, cpu->cs, cpu->ss, cpu->ss, cpu->intr, exception_messages[cpu->intr], cpu->error, cpu->error, num_tasks, *(int*)(current_task->cpu_state->eip), current_task->executableName); color = 0x07; } struct cpu_state *interrupt_handler(struct cpu_state *cpu) { if (cpu->intr <= 0x1f) { if(!kill_task(current_task->pid, cpu)) { bluescreen(cpu); // Prozessor anhalten asm volatile("cli; hlt"); } } else if(cpu->intr <= 0x2f && cpu->intr >= 0x20) { return irq_handler(cpu); } else if(cpu->intr == 0x30) { // Syscall! return syscall(cpu); } else if(cpu->intr == 0x31) // DarkblackAPI { return darkblack_handler(cpu); } else if(cpu->intr == 0x50) // LF API { return lf_api_handler(cpu); } return cpu; } void idt_install() { /* EXCEPTIONS */ idt_set_gate(0,(unsigned)isr0,0x08,0x8E); idt_set_gate(1,(unsigned)isr1,0x08,0x8E); idt_set_gate(2,(unsigned)isr2,0x08,0x8E); idt_set_gate(3,(unsigned)isr3,0x08,0x8E); idt_set_gate(4,(unsigned)isr4,0x08,0x8E); idt_set_gate(5,(unsigned)isr5,0x08,0x8E); idt_set_gate(6,(unsigned)isr6,0x08,0x8E); idt_set_gate(7,(unsigned)isr7,0x08,0x8E); idt_set_gate(8,(unsigned)isr8,0x08,0x8E); idt_set_gate(9,(unsigned)isr9,0x08,0x8E); idt_set_gate(10,(unsigned)isr10,0x08,0x8E); idt_set_gate(11,(unsigned)isr11,0x08,0x8E); idt_set_gate(12,(unsigned)isr12,0x08,0x8E); idt_set_gate(13,(unsigned)isr13,0x08,0x8E); idt_set_gate(14,(unsigned)isr14,0x08,0x8E); idt_set_gate(15,(unsigned)isr15,0x08,0x8E); idt_set_gate(16,(unsigned)isr16,0x08,0x8E); idt_set_gate(17,(unsigned)isr17,0x08,0x8E); idt_set_gate(18,(unsigned)isr18,0x08,0x8E); idt_set_gate(19,(unsigned)isr19,0x08,0x8E); idt_set_gate(20,(unsigned)isr20,0x08,0x8E); idt_set_gate(21,(unsigned)isr21,0x08,0x8E); idt_set_gate(22,(unsigned)isr22,0x08,0x8E); idt_set_gate(23,(unsigned)isr23,0x08,0x8E); idt_set_gate(24,(unsigned)isr24,0x08,0x8E); idt_set_gate(25,(unsigned)isr25,0x08,0x8E); idt_set_gate(26,(unsigned)isr26,0x08,0x8E); idt_set_gate(27,(unsigned)isr27,0x08,0x8E); idt_set_gate(28,(unsigned)isr28,0x08,0x8E); idt_set_gate(29,(unsigned)isr29,0x08,0x8E); idt_set_gate(30,(unsigned)isr30,0x08,0x8E); idt_set_gate(31,(unsigned)isr31,0x08,0x8E); // IRQs idt_set_gate(32,(unsigned)isr32,0x08,0x8E); idt_set_gate(33,(unsigned)isr33,0x08,0x8E); idt_set_gate(34,(unsigned)isr34,0x08,0x8E); idt_set_gate(35,(unsigned)isr35,0x08,0x8E); idt_set_gate(36,(unsigned)isr36,0x08,0x8E); idt_set_gate(37,(unsigned)isr37,0x08,0x8E); idt_set_gate(38,(unsigned)isr38,0x08,0x8E); idt_set_gate(39,(unsigned)isr39,0x08,0x8E); idt_set_gate(40,(unsigned)isr40,0x08,0x8E); idt_set_gate(41,(unsigned)isr41,0x08,0x8E); idt_set_gate(42,(unsigned)isr42,0x08,0x8E); idt_set_gate(43,(unsigned)isr43,0x08,0x8E); idt_set_gate(44,(unsigned)isr44,0x08,0x8E); idt_set_gate(45,(unsigned)isr45,0x08,0x8E); idt_set_gate(46,(unsigned)isr46,0x08,0x8E); idt_set_gate(47,(unsigned)isr47,0x08,0x8E); // Syscall idt_set_gate(48,(unsigned)isr48,0x08,0xEE); // DarkblackAPI idt_set_gate(49,(unsigned)isr49,0x08,0xEE); // LF API idt_set_gate(80,(unsigned)isr80,0x08,0xEE); idtp.limit = (sizeof (struct idt_entry) * 256) - 1; idtp.base = (unsigned int)&idt; asm volatile("lidt %0" : : "m" (idtp)); }