commit a7d5148aadd4989eb9827328c5a91260b8750d5d
parent ae0d61fe9315e3606e3505bf56d021371cca66f7
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 10 Feb 2026 21:16:49 -0800
Fix IRQ/FIQ
Diffstat:
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 {