oxytoxin

unix-like kernel
git clone git://git.evenfri.xyz/oxytoxin.git
Log | Files | Refs | README | LICENSE

idt.c (1180B)


      1 #include "oxytoxin.h"
      2 
      3 static idt_entry_t idt[256];
      4 static idtr_t idtr;
      5 
      6 void excp_handler() {
      7   tty_write("IDT: exception handled\n", 23);
      8   asm volatile ("cli; hlt");
      9 }
     10 
     11 void pic_remap() {
     12   asm volatile ("cli");
     13 
     14   outb(pic_1_comm, icw_1); io_wait();
     15   outb(pic_2_comm, icw_1); io_wait();
     16 
     17   outb(pic_1_data, irq_0); io_wait();
     18   outb(pic_2_data, irq_8); io_wait();
     19 
     20   outb(pic_1_data, 0x01); io_wait();
     21   outb(pic_2_data, 0x01); io_wait();
     22 
     23   outb(pic_1_data, 0b11111101); io_wait();
     24   outb(pic_2_data, 0xff); io_wait();
     25 }
     26 
     27 void idt_load() {
     28   int idt_row_count;
     29 
     30   idt_row_count = sizeof(idt) / sizeof(idt[0]);
     31   idtr.base = (unsigned int)(&idt[0]);
     32   idtr.limit = (sizeof(idt_entry_t) * idt_row_count) - 1;
     33   asm volatile ("lidt %0" : : "m" (idtr));
     34 }
     35 
     36 void idt_register(unsigned char vec, int_handler handler) {
     37   unsigned int addr;
     38 
     39   addr = (unsigned int) handler;
     40   idt[vec].isr_low = addr & 0xffffffff;
     41   idt[vec].kernel_cs = 0x08;
     42   idt[vec].reserved = 0;
     43   idt[vec].attr = 0x8e;
     44   idt[vec].isr_high = addr >> 16;
     45 }
     46 
     47 void idt_init(void) {
     48   asm volatile ("cli");
     49   for (int i = 0; i < 256; i++) {
     50     idt_register(i, excp_handler);
     51   }
     52 
     53   pic_remap();
     54   idt_load();
     55 }