#ifndef IDT_H
#define IDT_H

#include <stdint.h>

// Структура одного элемента таблицы IDT (8 байт)
struct idt_entry {
    uint16_t base_low;  // Младшие 16 бит адреса функции-обработчика
    uint16_t sel;       // Сегментный селектор кода (0x08 — Kernel Code в GDT)
    uint8_t  always0;   // Всегда 0, зарезервировано процессором
    uint8_t  flags;     // Флаги доступа (0x8E для Ring 0 прерываний)
    uint16_t base_high; // Старшие 16 бит адреса функции-обработчика
} __attribute__((packed));

// Структура «указателя» для инструкции lidt (6 байт)
struct idt_ptr {
    uint16_t limit;     // Размер таблицы в байтах минус 1 (256 * 8 - 1)
    uint32_t base;      // Физический адрес начала массива структур idt_entry
} __attribute__((packed));

// Структура, передаваемая в Си-обработчик, содержащая состояние всех регистров
struct registers {
    uint32_t ds;
    uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax;
    // Эти два поля ДОЛЖНЫ идти именно в таком порядке, 
    // чтобы 32 попало в int_no
    uint32_t int_no;   
    uint32_t err_code; 
    uint32_t eip, cs, eflags, useresp, ss;
};

// Объявляем функции для вызова извне
void idt_init(void);
void idt_set_gate(uint8_t num, uint32_t base, uint16_t sel, uint8_t flags);

#endif
