hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/boot/pic.zig
diff options
context:
space:
mode:
Diffstat (limited to 'boot/pic.zig')
-rw-r--r--boot/pic.zig22
1 files changed, 22 insertions, 0 deletions
diff --git a/boot/pic.zig b/boot/pic.zig
new file mode 100644
index 0000000..0bec4a8
--- /dev/null
+++ b/boot/pic.zig
@@ -0,0 +1,22 @@
+// this is just a 8259 PIC thing in zig, kinda defines only the constants the
+// IDT needs cause the actual remapping and masking is done in the kernel level
+// which is pretty cool.EOI has to stay here cause it runs inside the ISR tho,
+// so somewhere the VM cant really do much.
+//
+// see: https://wiki.osdev.org/8259_PIC
+
+const port = @import("port.zig");
+
+const MASTER_CMD: u16 = 0x20;
+const SLAVE_CMD: u16 = 0xA0;
+const EOI: u8 = 0x20; // end-of-interrupt command
+
+pub const MASTER_OFFSET: u8 = 0x20; // IRQ0..7 -> vectors 0x20..0x27
+pub const SLAVE_OFFSET: u8 = 0x28; // IRQ8..15 -> vectors 0x28..0x2F
+
+// tell the PIC we're done. the slave's interrupts also need the master EOI'd
+// since they arrive via the cascade.
+pub fn eoi(irq: u4) void {
+ if (irq >= 8) port.outb(SLAVE_CMD, EOI);
+ port.outb(MASTER_CMD, EOI);
+}