aboutsummaryrefslogtreecommitdiff
path: root/kernel/interrupts/idt.dats
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/interrupts/idt.dats')
-rw-r--r--kernel/interrupts/idt.dats52
1 files changed, 52 insertions, 0 deletions
diff --git a/kernel/interrupts/idt.dats b/kernel/interrupts/idt.dats
new file mode 100644
index 0000000..380260a
--- /dev/null
+++ b/kernel/interrupts/idt.dats
@@ -0,0 +1,52 @@
+#include "kernel/kernel_prelude.hats"
+
+#define ATS_DYNLOADFLAG 0
+
+staload "./idt.sats"
+
+extern castfn i2u8 {n: nat} (i: int n): uint8 n
+extern castfn i2u16 {n: nat} (i: int n): uint16 n
+extern castfn i2u32 {n: nat} (i: int n): uint32 n
+extern castfn i2u64 {n: nat} (i: int n): uint64 n
+extern castfn i2u {n: int} (i: uint8 n): int n
+
+%{
+ __attribute__ ((interrupt))
+%}
+// Default exception handler
+fun default_exception_handler(frame: &int_frame) : void = let
+in
+ println!("DEFAULT EXCEPTION HANDLER - NO ERROR CODE")
+end
+
+
+%{
+ __attribute__ ((interrupt))
+%}
+// Default exception handler (with error code)
+fun default_exception_handler_e(frame: &int_frame, error_code : uint64) : void = let
+in
+ println!("DEFAULT EXCEPTION HANDLER - ERROR CODE")
+end
+
+var idt : @[idt_entry_t][256] // The table
+var idtr : idtr_t // interrupt descriptor table register instance
+
+fun idt_set_descriptor {l : agz} {n : nat | n < 256} (vector: uint8 n, isr: ptr l, flags: uint8) : void = let
+ extern praxi __assert{l:addr} (ptr: ptr (l)): vtakeout0 (@[idt_entry_t][256]@l)
+ prval (pf, fpf) = __assert (addr@(idt))
+ val t = @{
+ isr_low = i2u16(0),
+ kernel_cs = i2u16(0) ,
+ ist = i2u8(0),
+ attributes = i2u8(0) ,
+ isr_mid = i2u16(0),
+ isr_high = i2u32(0),
+ reserved = i2u32(0)
+ }
+in
+ idt[i2u(vector)] := t;
+ let prval () = fpf(pf) in end
+end
+
+implement idt_init() : void = let in end