# IDT generation and loading The IDT management is defined inside `shelter/lib/include/irq/idt.h` and implemented inside `shelter/lib/src/irq/idt.c`. The current IDT generator generate the IDT according to boot process needs, and is therefore not definitive. ## IDT generation The IDT entry is structured with this structure: ``` C #pragma pack(1) typedef struct { sh_uint16 offset_low; sh_uint16 selector; sh_uint8 ist; sh_uint8 type_attr; sh_uint16 offset_mid; sh_uint32 offset_high; sh_uint32 reserved; } sh_idt_IDT_ENTRY; #pragma pack() ``` The full IDT is stored in this structure: ``` C #pragma pack(1) typedef struct { sh_idt_IDT_ENTRY entries[256]; } sh_idt_IDT; #pragma pack() ``` IDT entries are generated using the following functions: - `sh_idt_fill_type_attr_byte(sh_bool present,sh_uint8 dpl,sh_uint8 type)`: generate the `type_attr` byte - `sh_idt_fill_idt_entry(sh_uint64 offset,sh_uint16 selector,sh_uint8 ist,sh_uint8 type_attr)`: generate an IDT entry, expect the `type_attr` argument as `sh_idt_fill_type_attr_byte()` would generate it The IDT is generated by `sh_idt_fill_idt(sh_idt_IDT *idt)`. Using the following structure: ``` C #pragma pack(1) typedef struct { sh_uint16 limit; sh_uint64 base; } sh_idt_IDTR; #pragma pack() ``` `sh_idt_load_idtr(sh_idt_IDT *idt)` load the IDT. The following vectors are filled for the moment: 0 to 21, 28 to 30, 32 to 47, 254 and 255. Please see the [IRQ docs](irq.md) to see how the handlers work.