sylveos

Toy Operating System
Log | Files | Refs

commit 488915e5ea9843f6aab631b3d7393b3d4db0b77d
parent bc6e627ad26ad98a63c5686c1402177859859b0e
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 24 Feb 2026 17:36:29 -0800

Unify interrupt stacks

Diffstat:
Mpi/interrupts.zig | 27+++++++++++----------------
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;