aboutsummaryrefslogtreecommitdiffstats
path: root/src/interrupt.zig
blob: 8aea51fec0e371810a699aeb6dd862e1de1ecb3e (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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Copyright (C) 2024 Clyne Sullivan <clyne@bitgloo.com>
//
// Distributed under the GNU GPL v3 or later. You should have received a copy of
// the GNU General Public License along with this program.
// If not, see <https://www.gnu.org/licenses/>.

extern const init_vector_table: [2]u32;

const vector_table_type = [128] *const fn () void; // up to 256
var vector_table: vector_table_type align(256) = undefined;
var vtor: **volatile vector_table_type = @ptrFromInt(0xE000ED08);

pub const vector = enum(u7) {
    NMI = 2,
    HardFault,
    MemManage,
    BusFault,
    UsageFault,
    rsvd7,
    rsvd8,
    rsvd9,
    rsvd10,
    SVCall,
    DebugMonitor,
    rsvd13,
    PendSV,
    SysTick,
};

pub fn initialize() void {
    vector_table[0] = @ptrFromInt(init_vector_table[0]);
    vector_table[1] = @ptrFromInt(init_vector_table[1]);
    register(.NMI, nmi);
    register(.HardFault, hardfault);
    register(.MemManage, memmanage);
    register(.BusFault, busfault);
    register(.UsageFault, usagefault);

    vtor.* = &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) {} }