aboutsummaryrefslogtreecommitdiff
path: root/mirai/interrupts/idt.zig
diff options
context:
space:
mode:
Diffstat (limited to 'mirai/interrupts/idt.zig')
-rw-r--r--mirai/interrupts/idt.zig49
1 files changed, 49 insertions, 0 deletions
diff --git a/mirai/interrupts/idt.zig b/mirai/interrupts/idt.zig
new file mode 100644
index 0000000..7cafb4f
--- /dev/null
+++ b/mirai/interrupts/idt.zig
@@ -0,0 +1,49 @@
+//! IDT - Interrupt Descriptor Table
+
+const gdt = @import("../boot/gdt/gdt.zig");
+const asm_int = @import("../asm/interrupts/interrupts.zig");
+
+pub const types = @import("types/types.zig");
+pub const table = @import("table/table.zig");
+pub const handlers = @import("handlers/handlers.zig");
+pub const load = @import("load/load.zig");
+pub const pic = @import("pic/pic.zig");
+
+pub const Gate64 = types.Gate64;
+pub const Descriptor = types.Descriptor;
+pub const InterruptFrame = handlers.InterruptFrame;
+
+pub const set_gate = table.set_gate;
+pub const set_interrupt = table.set_interrupt;
+pub const set_trap = table.set_trap;
+pub const register_irq = handlers.register_irq;
+pub const unregister_irq = handlers.unregister_irq;
+
+pub fn initialize() void {
+ pic.remap();
+ pic.mask_all();
+
+ const selector = gdt.selectors.kernel_code_selector;
+
+ for (0..32) |i| {
+ const vector: u8 = @truncate(i);
+ const handler_ptr = @intFromPtr(handlers.exceptions.stubs[i]);
+ table.set_interrupt(vector, handler_ptr, selector);
+ }
+
+ for (0..16) |i| {
+ const vector: u8 = @truncate(i + 32);
+ const handler_ptr = @intFromPtr(handlers.hardware.stubs[i]);
+ table.set_interrupt(vector, handler_ptr, selector);
+ }
+
+ load.load();
+}
+
+pub fn enable() void {
+ asm_int.enable();
+}
+
+pub fn disable() void {
+ asm_int.disable();
+}