commit 3fa4913f626e710efdffdc96c1ef24f99f86a32e
parent a7d5148aadd4989eb9827328c5a91260b8750d5d
Author: Sylvia Ivory <git@sivory.net>
Date: Tue, 10 Feb 2026 21:23:37 -0800
Preserve all registers
Diffstat:
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/pi/interrupts.zig b/pi/interrupts.zig
@@ -109,7 +109,9 @@ var fast_interrupt_handler: *const fn (u32, *Registers) void = empty;
pub const Registers = struct {
gp: [13]usize,
+ sp: usize,
lr: usize,
+ pc: usize,
};
export fn reset_stub(pc: u32, reg: *Registers) void {
@@ -139,12 +141,12 @@ fn create_trampoline(name: []const u8, offset: []const u8, ret: []const u8) []co
".global " ++ name ++ "\n" ++
".type " ++ name ++ ", %function\n" ++
name ++ ":\n" ++
- " push {r0-r12, lr}\n" ++
+ " push {r0-r15}\n" ++
" sub lr, lr, #" ++ offset ++ "\n" ++
" mov r0, lr\n" ++
" mov r1, sp\n" ++
" blx " ++ name ++ "_stub\n" ++
- " pop {r0-r12, lr}\n" ++ ret;
+ " pop {r0-r14}\n" ++ ret;
}
comptime {
diff --git a/programs/syscall.zig b/programs/syscall.zig
@@ -36,7 +36,9 @@ noinline fn software_interrupt_handler(pc: u32, registers: *interrupts.Registers
for (dup.gp, 0..dup.gp.len) |r, i| {
uart.writer.print("r{d} = {d}\n", .{ i, r }) catch {};
}
+ uart.writer.print("sp = 0x{X}\n", .{dup.sp}) catch {};
uart.writer.print("lr = 0x{X}\n", .{dup.lr}) catch {};
+ uart.writer.print("pc = 0x{X}\n", .{dup.pc}) catch {};
uart.toggle_tx_interrupts();
}