Files
kernel3/kernel/idt.c
T

57 lines
2.7 KiB
C

#include "../includes/idt.h"
#include "../includes/interrupt_handler.h"
struct idt_entry idt_entries[256];
struct idt_ptr idt;
void idt_install()
{
idt.size = (sizeof (struct idt_entry) * 256) - 1;
idt.idt_entries_start = (struct idt_entry *) &idt_entries;
idt_set_gate(&idt_entries[0], (unsigned int) isr0, 0x08, 0x8E);
idt_set_gate(&idt_entries[1], (unsigned int) isr1, 0x08, 0x8E);
idt_set_gate(&idt_entries[2], (unsigned int) isr2, 0x08, 0x8E);
idt_set_gate(&idt_entries[3], (unsigned int) isr3, 0x08, 0x8E);
idt_set_gate(&idt_entries[4], (unsigned int) isr4, 0x08, 0x8E);
idt_set_gate(&idt_entries[5], (unsigned int) isr5, 0x08, 0x8E);
idt_set_gate(&idt_entries[6], (unsigned int) isr6, 0x08, 0x8E);
idt_set_gate(&idt_entries[7], (unsigned int) isr7, 0x08, 0x8E);
idt_set_gate(&idt_entries[8], (unsigned int) isr8, 0x08, 0x8E);
idt_set_gate(&idt_entries[9], (unsigned int) isr9, 0x08, 0x8E);
idt_set_gate(&idt_entries[10], (unsigned int) isr10, 0x08, 0x8E);
idt_set_gate(&idt_entries[11], (unsigned int) isr11, 0x08, 0x8E);
idt_set_gate(&idt_entries[12], (unsigned int) isr12, 0x08, 0x8E);
idt_set_gate(&idt_entries[13], (unsigned int) isr13, 0x08, 0x8E);
idt_set_gate(&idt_entries[14], (unsigned int) isr14, 0x08, 0x8E);
idt_set_gate(&idt_entries[15], (unsigned int) isr15, 0x08, 0x8E);
idt_set_gate(&idt_entries[16], (unsigned int) isr16, 0x08, 0x8E);
idt_set_gate(&idt_entries[17], (unsigned int) isr17, 0x08, 0x8E);
idt_set_gate(&idt_entries[18], (unsigned int) isr18, 0x08, 0x8E);
idt_set_gate(&idt_entries[19], (unsigned int) isr19, 0x08, 0x8E);
idt_set_gate(&idt_entries[20], (unsigned int) isr20, 0x08, 0x8E);
idt_set_gate(&idt_entries[21], (unsigned int) isr21, 0x08, 0x8E);
idt_set_gate(&idt_entries[22], (unsigned int) isr22, 0x08, 0x8E);
idt_set_gate(&idt_entries[23], (unsigned int) isr23, 0x08, 0x8E);
idt_set_gate(&idt_entries[24], (unsigned int) isr24, 0x08, 0x8E);
idt_set_gate(&idt_entries[25], (unsigned int) isr25, 0x08, 0x8E);
idt_set_gate(&idt_entries[26], (unsigned int) isr26, 0x08, 0x8E);
idt_set_gate(&idt_entries[27], (unsigned int) isr27, 0x08, 0x8E);
idt_set_gate(&idt_entries[28], (unsigned int) isr28, 0x08, 0x8E);
idt_set_gate(&idt_entries[29], (unsigned int) isr29, 0x08, 0x8E);
idt_set_gate(&idt_entries[30], (unsigned int) isr30, 0x08, 0x8E);
idt_set_gate(&idt_entries[31], (unsigned int) isr31, 0x08, 0x8E);
//asm("xchg %bx, %bx");
load_idt(&idt);
}
void idt_set_gate(struct idt_entry* entry, unsigned long base, unsigned short sel, unsigned char flags)
{
entry->base_lo = (base & 0xFFFF);
entry->base_hi = (base >> 16) & 0xFFFF;
entry->sel = sel;
entry->always0 = 0;
entry->flags = flags;
}