commit 70afc5c707eaecefe3327b19d72fe099752671ad
parent a371c28e051486cc6c5f6a5570ab60638a033466
Author: Sylvia Ivory <git@sivory.net>
Date: Sat, 31 Jan 2026 10:23:41 -0800
Add pi.reboot
Diffstat:
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,
};