Files
vystem-b/docs/shelter/irq/idt.md
2026-05-27 19:34:54 +02:00

1.5 KiB

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:

#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:

#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:

#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 to see how the handlers work.