kernel

hobby kernel
git clone git://git.evenfri.xyz/kernel.git
Log | Files | Refs | README | LICENSE

idt.c (1171B)


      1 #include <fns.h>
      2 
      3 static idt_entry_t idt[256];
      4 static idtr_t idtr;
      5 
      6 void excp_handler() {
      7   asm volatile ("cli; hlt");
      8 }
      9 
     10 void pic_remap() {
     11   asm volatile ("cli");
     12 
     13   outb(pic_1_comm, icw_1); io_wait();
     14   outb(pic_2_comm, icw_1); io_wait();
     15 
     16   outb(pic_1_data, irq_0); io_wait();
     17   outb(pic_2_data, irq_8); io_wait();
     18   
     19   outb(pic_1_data, 0x04); io_wait();
     20   outb(pic_2_data, 0x02); io_wait();
     21 
     22   outb(pic_1_data, 0x01); io_wait();
     23   outb(pic_2_data, 0x01); io_wait();
     24 
     25   outb(pic_1_data, 0xFC); io_wait();
     26   outb(pic_2_data, 0xff); io_wait();
     27 }
     28 
     29 void idt_load() {
     30   int 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 = (unsigned int) handler;
     38 
     39   idt[vec].isr_low = addr & 0xffff;
     40   idt[vec].kernel_cs = 0x08;
     41   idt[vec].reserved = 0;
     42   idt[vec].attr = 0x8e;
     43   idt[vec].isr_high = addr >> 16;
     44 }
     45 
     46 void idt_init(void) {
     47   asm volatile ("cli");
     48   for (int i = 0; i < 256; i++) {
     49     idt_register(i, excp_handler);
     50   }
     51 
     52   pic_remap();
     53   idt_load();
     54 }