sylveos

Toy Operating System
Log | Files | Refs

commit 3fa4913f626e710efdffdc96c1ef24f99f86a32e
parent a7d5148aadd4989eb9827328c5a91260b8750d5d
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 10 Feb 2026 21:23:37 -0800

Preserve all registers

Diffstat:
Mpi/interrupts.zig | 6++++--
Mprograms/syscall.zig | 2++
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(); }