sylveos

Toy Operating System
Log | Files | Refs

commit a7d5148aadd4989eb9827328c5a91260b8750d5d
parent ae0d61fe9315e3606e3505bf56d021371cca66f7
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 10 Feb 2026 21:16:49 -0800

Fix IRQ/FIQ

Diffstat:
Mpi/interrupts.zig | 37+++++++++++++++----------------------
1 file changed, 15 insertions(+), 22 deletions(-)

diff --git a/pi/interrupts.zig b/pi/interrupts.zig @@ -127,20 +127,14 @@ export fn prefetch_abort_stub(pc: u32, reg: *Registers) void { export fn data_abort_stub(pc: u32, reg: *Registers) void { data_abort_handler(pc, reg); } -// export fn interrupt_stub(pc: u32, reg: *Registers) void { -// interrupt_handler(pc, reg); -// } -export fn interrupt() callconv(.{ .arm_interrupt = .{ .type = .irq } }) void { - interrupt_handler(0, @ptrFromInt(@frameAddress())); +export fn interrupt_stub(pc: u32, reg: *Registers) void { + interrupt_handler(pc, reg); } -// export fn fast_interrupt_stub(pc: u32, reg: *Registers) void { -// fast_interrupt_handler(pc, reg); -// } -export fn fast_interrupt() callconv(.{ .arm_interrupt = .{ .type = .fiq } }) void { - fast_interrupt_handler(0, @ptrFromInt(@frameAddress())); +export fn fast_interrupt_stub(pc: u32, reg: *Registers) void { + fast_interrupt_handler(pc, reg); } -fn create_trampoline(name: []const u8, offset: []const u8) []const u8 { +fn create_trampoline(name: []const u8, offset: []const u8, ret: []const u8) []const u8 { return "" ++ ".global " ++ name ++ "\n" ++ ".type " ++ name ++ ", %function\n" ++ @@ -150,26 +144,25 @@ fn create_trampoline(name: []const u8, offset: []const u8) []const u8 { " mov r0, lr\n" ++ " mov r1, sp\n" ++ " blx " ++ name ++ "_stub\n" ++ - " pop {r0-r12, lr}\n" ++ - " movs pc, lr\n"; + " pop {r0-r12, lr}\n" ++ ret; } comptime { - asm (create_trampoline("reset", "4")); - asm (create_trampoline("undefined_instruction", "4")); - asm (create_trampoline("software_interrupt", "4")); - asm (create_trampoline("prefetch_abort", "4")); - asm (create_trampoline("data_abort", "8")); - // asm (create_trampoline("interrupt", "4")); - // asm (create_trampoline("fast_interrupt", "4")); + asm (create_trampoline("reset", "4", "")); // doesn't matter + asm (create_trampoline("undefined_instruction", "4", "movs pc, lr")); + asm (create_trampoline("software_interrupt", "4", "movs pc, lr")); + asm (create_trampoline("prefetch_abort", "4", "subs pc, lr, #4")); + asm (create_trampoline("data_abort", "8", "subs pc, lr, #8")); + asm (create_trampoline("interrupt", "4", "subs pc, lr, #4")); + asm (create_trampoline("fast_interrupt", "4", "subs pc, lr, #4")); } extern fn reset() void; extern fn undefined_instruction() void; extern fn software_interrupt() void; extern fn prefetch_abort() void; extern fn data_abort() void; -// extern fn interrupt() void; -// extern fn fast_interrupt() void; +extern fn interrupt() void; +extern fn fast_interrupt() void; // https://leiradel.github.io/2019/02/09/Initialization.html pub fn setup_exception_vector() void {