idt.c (1285B)
1 /*#include <stdint.h> 2 #include "../include/io.h" 3 #include "../include/idt.h" 4 5 struct interrupt_frame { 6 uint64_t r15, r14, r13, r12, r11, r10, r9, r8, rbp, rdi, rsi, rdx, rcx, rbx, rax; 7 uint64_t vec, error_code; 8 uint64_t rip, cs, rflags, rsp, ss; 9 }; 10 11 struct idt_entry { 12 uint16_t offset_low; 13 uint16_t sel; 14 uint8_t ist; 15 uint8_t types; 16 uint16_t offset_mid; 17 uint32_t offset_high; 18 uint32_t zero; 19 }__attribute__((packed)) idte_e[256]; 20 21 struct idtr { 22 uint16_t limit; 23 uint64_t base; 24 }__attribute__((packed)); 25 26 struct idtr idtr_f; 27 28 void set_entry (int vec, uint64_t idt_handler) { 29 idte_e[vec].offset_low = (idt_handler) & 0xFFFF; 30 idte_e[vec].offset_mid = (idt_handler >> 16) & 0xFFFF; 31 idte_e[vec].offset_high = (idt_handler >> 32); 32 idte_e[vec].sel = 0x08; 33 idte_e[vec].ist = 0; 34 idte_e[vec].types = 0x8E; 35 idte_e[vec].zero = 0; 36 } 37 38 void load_idt (int vec, uint64_t idt_handler) { 39 40 for (int i = 0; i < 256; i++) 41 idte_e[i] = (struct idt_entry){0}; 42 43 set_entry(vec, idt_handler); 44 45 idtr_f.limit = sizeof(idte_e) - 1; 46 idtr_f.base = (uint64_t)&idte_e; 47 48 __asm__ volatile ("lidt %0" : : "m" (idtr_f)); 49 } 50 51 void interrupt_handler (struct interrupt_frame *frame) { 52 if (frame->vec == 0) { 53 54 } 55 }*/