sylveos

Toy Operating System
Log | Files | Refs

commit 70afc5c707eaecefe3327b19d72fe099752671ad
parent a371c28e051486cc6c5f6a5570ab60638a033466
Author: Sylvia Ivory <git@sivory.net>
Date:   Sat, 31 Jan 2026 10:23:41 -0800

Add pi.reboot

Diffstat:
Mboot/root.zig | 3+--
Mpi/root.zig | 19+++++++++++++++++++
Mprograms/bootloader.zig | 6++----
3 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/boot/root.zig b/boot/root.zig @@ -50,7 +50,7 @@ export fn kmain() void { export fn abort() noreturn { @branchHint(.cold); - while (true) {} + pi.reboot(); } fn panic_handler(msg: []const u8, trace_addr: ?usize) noreturn { @@ -70,7 +70,6 @@ fn panic_handler(msg: []const u8, trace_addr: ?usize) noreturn { } } - // TODO; proper abort abort(); } diff --git a/pi/root.zig b/pi/root.zig @@ -63,3 +63,22 @@ pub fn setup_stacks() void { // Restore original_cpsr.set_c(); } + +pub fn reboot() noreturn { + // Prevent any more interrupts + _ = mem.enter_critical_section(); + + // Flush remaining tx + devices.mini_uart.flush(); + + // Set watchdog and go into infinite loop, forcing a reboot + const PM_RSTC: usize = 0x2010001c; + const PM_WDOG: usize = 0x20100024; + const PM_PASSWORD: u32 = 0x5a000000; + const PM_RSTC_WRCFG_FULL_RESET: u32 = 0x00000020; + + mem.put_u32_barrier(@ptrFromInt(PM_WDOG), PM_PASSWORD | 1); + mem.put_u32_barrier(@ptrFromInt(PM_RSTC), PM_PASSWORD | PM_RSTC_WRCFG_FULL_RESET); + + while (true) {} +} diff --git a/programs/bootloader.zig b/programs/bootloader.zig @@ -34,8 +34,7 @@ pub fn main() !void { Error.BadAddress => { try net.put_message(w, .BAD_CODE_ADDR); - // TODO; reboot - return; + return pi.reboot(); }, else => unreachable, }; @@ -55,8 +54,7 @@ pub fn main() !void { Error.BadChecksum => { try net.put_message(w, .BAD_CODE_CKSUM); - // TODO; reboot - return; + return pi.reboot(); }, else => unreachable, };