sylveos

Toy Operating System
Log | Files | Refs

commit ad5c9a1189bfda3f02bf087702be75a31deef32c
parent 3be5b298f3b4b8e47bf173d192b0b00cd9d316b3
Author: Sylvia Ivory <git@sivory.net>
Date:   Tue, 17 Feb 2026 22:56:38 -0800

Signal to tools a reboot occured

Diffstat:
Mpi/root.zig | 4+++-
Mtools/src/main.rs | 22+++++++++++++++++++---
2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/pi/root.zig b/pi/root.zig @@ -1,6 +1,6 @@ const std = @import("std"); -pub const Scheduler = @import("scheduler.zig"); +pub const Coroutine = @import("coroutine.zig"); pub const PSR = @import("./psr.zig").PSR; pub const interrupts = @import("./interrupts.zig"); @@ -85,6 +85,8 @@ pub fn reboot() noreturn { // Prevent any more interrupts _ = mem.enter_critical_section(); + // Notify serial that we're done + devices.mini_uart.write_byte_sync(0); // Flush remaining tx devices.mini_uart.flush(); diff --git a/tools/src/main.rs b/tools/src/main.rs @@ -1,8 +1,8 @@ use clap::Parser; use indicatif::ProgressStyle; -use tokio::io; +use tokio::io::{self, AsyncReadExt, AsyncWriteExt, ReadHalf, Stdout}; use tokio_serial::{DataBits, FlowControl, Parity, SerialPortBuilderExt, SerialStream, StopBits}; -use tracing::{level_filters::LevelFilter, warn}; +use tracing::{info, level_filters::LevelFilter, warn}; use tracing_indicatif::{ IndicatifLayer, filter::{IndicatifFilter, hide_indicatif_span_fields}, @@ -43,6 +43,22 @@ fn hex_value(s: &str) -> Result<u32, String> { u32::from_str_radix(trimmed, 16).map_err(|e| e.to_string()) } +async fn serial_to_stdout( + serial: &mut ReadHalf<SerialStream>, + stdout: &mut Stdout, +) -> io::Result<()> { + loop { + let byte = serial.read_u8().await?; + + if byte == 0 { + info!("pi exited"); + exit(0); + } + + stdout.write_u8(byte).await?; + } +} + async fn default_action(port: SerialStream) -> anyhow::Result<()> { let (mut port_read, mut port_write) = io::split(port); let mut stdin = io::stdin(); @@ -53,7 +69,7 @@ async fn default_action(port: SerialStream) -> anyhow::Result<()> { warn!("stdin disconnected, exiting"); exit(0); }, - _ = io::copy(&mut port_read, &mut stdout) => { + _ = serial_to_stdout(&mut port_read, &mut stdout) => { warn!("serial port disconnected, exiting"); exit(0); },