diff --git a/Cargo.toml b/Cargo.toml index ba298f5153..daffff0d77 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -120,7 +120,7 @@ bitflags = "2" build-time = "0.1.3" cfg-if = "1" crossbeam-utils = { version = "0.8", default-features = false } -embedded-io = "0.7" +embedded-io = { version = "0.7", features = ["alloc"] } enum_dispatch = "0.3" fdt = { version = "0.1", features = ["pretty-printing"] } free-list = "0.3" diff --git a/src/arch/aarch64/kernel/serial.rs b/src/arch/aarch64/kernel/serial.rs index 4311315a72..120fe2d9de 100644 --- a/src/arch/aarch64/kernel/serial.rs +++ b/src/arch/aarch64/kernel/serial.rs @@ -59,25 +59,13 @@ impl ErrorType for SerialDevice { impl Read for SerialDevice { fn read(&mut self, buf: &mut [u8]) -> Result { - let mut guard = UART_DEVICE.lock(); - - if guard.buffer.is_empty() { - Ok(0) - } else { - let min = buf.len().min(guard.buffer.len()); - - for (dst, src) in buf[..min].iter_mut().zip(guard.buffer.drain(..min)) { - *dst = src; - } - - Ok(min) - } + Ok(UART_DEVICE.lock().buffer.read(buf)?) } } impl ReadReady for SerialDevice { fn read_ready(&mut self) -> Result { - Ok(!UART_DEVICE.lock().buffer.is_empty()) + Ok(UART_DEVICE.lock().buffer.read_ready()?) } } diff --git a/src/arch/x86_64/kernel/serial.rs b/src/arch/x86_64/kernel/serial.rs index 5bb27cb23c..3e9c6b65e0 100644 --- a/src/arch/x86_64/kernel/serial.rs +++ b/src/arch/x86_64/kernel/serial.rs @@ -1,5 +1,4 @@ use alloc::collections::VecDeque; -use alloc::vec::Vec; use embedded_io::{ErrorType, Read, ReadReady, Write}; use hermit_sync::{InterruptTicketMutex, Lazy}; @@ -52,22 +51,13 @@ impl ErrorType for SerialDevice { impl Read for SerialDevice { fn read(&mut self, buf: &mut [u8]) -> Result { - let mut guard = UART_DEVICE.lock(); - if guard.buffer.is_empty() { - Ok(0) - } else { - let min = core::cmp::min(buf.len(), guard.buffer.len()); - let drained = guard.buffer.drain(..min).collect::>(); - buf[..min].copy_from_slice(drained.as_slice()); - Ok(min) - } + Ok(UART_DEVICE.lock().buffer.read(buf)?) } } impl ReadReady for SerialDevice { fn read_ready(&mut self) -> Result { - let read_ready = !UART_DEVICE.lock().buffer.is_empty(); - Ok(read_ready) + Ok(UART_DEVICE.lock().buffer.read_ready()?) } } diff --git a/src/errno.rs b/src/errno.rs index 3bc9363014..6f15789627 100644 --- a/src/errno.rs +++ b/src/errno.rs @@ -1,5 +1,7 @@ //! System error numbers. +use core::convert::Infallible; + use num_enum::{IntoPrimitive, TryFromPrimitive}; use thiserror::Error; @@ -669,6 +671,12 @@ pub enum Errno { Hwpoison = 133, } +impl From for Errno { + fn from(value: Infallible) -> Self { + match value {} + } +} + /// Returns the pointer to `errno`. #[cfg(all( not(any(feature = "common-os", feature = "nostd")),