aboutsummaryrefslogtreecommitdiff
path: root/mirai/interrupts/table/install.zig
blob: 72b9bab754f893a910a892962878e68dbb335561 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//! IDT Gate Installation

const types = @import("../types/types.zig");
const entries = @import("entries.zig");

pub fn set_gate(vector: u8, handler: u64, selector: u16, ist: u3, dpl: types.DPL, gate_type: types.GateType) void {
    entries.entries[vector] = switch (gate_type) {
        .interrupt => types.Gate64.interrupt(handler, selector, ist, dpl),
        .trap => types.Gate64.trap(handler, selector, ist, dpl),
    };
}

pub fn set_interrupt(vector: u8, handler: u64, selector: u16) void {
    set_gate(vector, handler, selector, 0, .ring0, .interrupt);
}

pub fn set_trap(vector: u8, handler: u64, selector: u16) void {
    set_gate(vector, handler, selector, 0, .ring0, .trap);
}

pub fn set_interrupt_ist(vector: u8, handler: u64, selector: u16, ist: u3) void {
    set_gate(vector, handler, selector, ist, .ring0, .interrupt);
}

pub fn clear_gate(vector: u8) void {
    entries.entries[vector] = types.Gate64.empty();
}