summaryrefslogtreecommitdiff
path: root/kernel/src/interrupt/idt.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/interrupt/idt.h')
-rw-r--r--kernel/src/interrupt/idt.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/kernel/src/interrupt/idt.h b/kernel/src/interrupt/idt.h
new file mode 100644
index 0000000..86a685f
--- /dev/null
+++ b/kernel/src/interrupt/idt.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include <stdint.h>
+
+#define IDT_SIZE 256
+#define IDT_INTERRUPTS 256
+
+struct IdtEntry {
+ uint16_t isr_low;
+ uint16_t kernel_cs;
+ uint8_t _reserved;
+ uint8_t attributes;
+ uint16_t isr_high;
+} __attribute__((packed));
+
+struct Idtr {
+ uint16_t limit;
+ uint32_t base;
+} __attribute__((packed));
+
+enum IDTFlags {
+ IDT_FLAG_GATE_TASK = 0x5,
+ IDT_FLAG_GATE_16BIT_INT = 0x6,
+ IDT_FLAG_GATE_16BIT_TRAP = 0x7,
+ IDT_FLAG_GATE_32BIT_INT = 0xE,
+ IDT_FLAG_GATE_32BIT_TRAP = 0xF,
+
+ IDT_FLAG_RING0 = (0 << 5),
+ IDT_FLAG_RING1 = (1 << 5),
+ IDT_FLAG_RING2 = (2 << 5),
+ IDT_FLAG_RING3 = (3 << 5),
+
+ IDT_FLAG_PRESENT = 0x80,
+};
+
+void idt_init(void);