forked from lolo859/vystem
Vystem 0.2
This commit is contained in:
49
docs/shelter/irq/idt.md
Normal file
49
docs/shelter/irq/idt.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user