diff options
| author | hachem <im@hachem.wtf> | 2026-09-12 10:59:26 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-12 10:59:26 +0200 |
| commit | d6d908e3386e107b41241e9eda7dc546581524df (patch) | |
| tree | 8219d02a7494152722ac7f32140d63c8a3b3daa7 /boot/pic.zig | |
| parent | 4f540af34d7a88547d60bed7bd28850e6d0e18ab (diff) | |
feat: basic keyboard driver + tester shell
Diffstat (limited to 'boot/pic.zig')
| -rw-r--r-- | boot/pic.zig | 22 |
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); +} |
