aboutsummaryrefslogtreecommitdiffstats
path: root/src/interrupt.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/interrupt.zig')
-rw-r--r--src/interrupt.zig40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/interrupt.zig b/src/interrupt.zig
new file mode 100644
index 0000000..60faec6
--- /dev/null
+++ b/src/interrupt.zig
@@ -0,0 +1,40 @@
+var vector_table: [256] *const fn () void = undefined;
+var vtor: *u32 = @ptrFromInt(0xE000ED08);
+
+pub const vector = enum(u8) {
+ NMI = 2,
+ HardFault,
+ MemManage,
+ BusFault,
+ UsageFault,
+ rsvd7,
+ rsvd8,
+ rsvd9,
+ rsvd10,
+ SVCall,
+ DebugMonitor,
+ rsvd13,
+ PendSV,
+ SysTick,
+};
+
+pub fn initialize() void {
+ register(.NMI, nmi);
+ register(.HardFault, hardfault);
+ register(.MemManage, memmanage);
+ register(.BusFault, busfault);
+ register(.UsageFault, usagefault);
+
+ vtor.* = @as(u32, @intFromPtr(&vector_table));
+}
+
+pub fn register(index: vector, handler: *const fn () void) void {
+ vector_table[@intFromEnum(index)] = handler;
+}
+
+fn nmi() void { while (true) {} }
+fn hardfault() void { while (true) {} }
+fn memmanage() void { while (true) {} }
+fn busfault() void { while (true) {} }
+fn usagefault() void { while (true) {} }
+