commit 1b56a12cf8851ca6118061624edd5fcd00754674
parent c8b11c0d45fd9d0a3b58e2da319595c2cbef619b
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 24 Feb 2026 17:36:29 -0800
Unify interrupt stacks
Diffstat:
1 file changed, 11 insertions(+), 16 deletions(-)
diff --git a/pi/interrupts.zig b/pi/interrupts.zig
@@ -171,25 +171,22 @@ inline fn setup_reg(pc: u32, gp: *const [13]u32) Registers {
}
// I still hate this
-const stack_size = 256; // 1kb stacks
+const stack_size = 256 * 16; // 16kb stacks
+pub export var exception_stack: [stack_size]usize align(8) = undefined;
// Things were already cooked
-pub export var reset_stack: [8]usize align(8) = undefined;
export fn reset_stub(pc: u32, gp: *const [13]u32) void {
reset_handler(setup_reg(pc, gp));
}
-pub export var undef_stack: [stack_size]usize align(8) = undefined;
export fn undefined_instruction_stub(pc: u32, gp: *const [13]u32) void {
undefined_instruction_handler(setup_reg(pc, gp));
}
-pub export var svc_stack: [stack_size]usize align(8) = undefined;
export fn software_interrupt_stub(pc: u32, gp: *const [13]u32) void {
software_interrupt_handler(setup_reg(pc, gp));
}
-pub export var abort_stack: [stack_size]usize align(8) = undefined;
export fn prefetch_abort_stub(pc: u32, gp: *const [13]u32) void {
prefetch_abort_handler(setup_reg(pc, gp));
}
@@ -198,24 +195,22 @@ export fn data_abort_stub(pc: u32, gp: *const [13]u32) void {
data_abort_handler(setup_reg(pc, gp));
}
-pub export var irq_stack: [stack_size]usize align(8) = undefined;
export fn interrupt_stub(pc: u32, gp: *const [13]u32) void {
interrupt_handler(setup_reg(pc, gp));
}
// TODO;
-pub export var fiq_stack: [stack_size]usize align(8) = undefined;
export fn fast_interrupt_stub(pc: u32, reg: *Registers) void {
_ = pc;
_ = reg;
}
-fn create_trampoline(name: []const u8, offset: []const u8, ret: []const u8, stack: []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" ++
name ++ ":\n" ++
- " ldr sp, =" ++ stack ++ "\n" ++
+ " ldr sp, =exception_stack\n" ++
" push {r0-r12, lr}\n" ++
" sub lr, lr, #" ++ offset ++ "\n" ++
" mov r0, lr\n" ++
@@ -225,13 +220,13 @@ fn create_trampoline(name: []const u8, offset: []const u8, ret: []const u8, stac
}
comptime {
- asm (create_trampoline("reset", "4", "", "reset_stack")); // doesn't matter
- asm (create_trampoline("undefined_instruction", "4", "movs pc, lr", "undef_stack"));
- asm (create_trampoline("software_interrupt", "4", "movs pc, lr", "svc_stack"));
- asm (create_trampoline("prefetch_abort", "4", "subs pc, lr, #4", "abort_stack"));
- asm (create_trampoline("data_abort", "8", "subs pc, lr, #8", "abort_stack"));
- asm (create_trampoline("interrupt", "4", "subs pc, lr, #4", "irq_stack"));
- asm (create_trampoline("fast_interrupt", "4", "subs pc, lr, #4", "fiq_stack"));
+ 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;