diff --git a/Cargo.lock b/Cargo.lock index a3357cd28..68298a77f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -207,7 +207,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -218,7 +218,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1283,7 +1283,7 @@ dependencies = [ "log", "loongArch64", "page_table_entry", - "uart_16550", + "uart_16550 0.5.0", ] [[package]] @@ -1309,7 +1309,7 @@ dependencies = [ "riscv_goldfish", "riscv_plic 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sbi-rt", - "uart_16550", + "uart_16550 0.5.0", ] [[package]] @@ -1328,7 +1328,7 @@ dependencies = [ "riscv_goldfish", "riscv_plic 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sbi-rt", - "uart_16550", + "uart_16550 0.4.0", ] [[package]] @@ -1347,7 +1347,7 @@ dependencies = [ "multiboot", "percpu", "raw-cpuid 11.6.0", - "uart_16550", + "uart_16550 0.5.0", "x2apic", "x86", "x86_64", @@ -1370,7 +1370,7 @@ dependencies = [ "multiboot", "percpu", "raw-cpuid 11.6.0", - "uart_16550", + "uart_16550 0.4.0", "x2apic", "x86", "x86_64", @@ -2152,7 +2152,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3092,7 +3092,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -3999,7 +3999,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -6033,7 +6033,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys 0.12.1", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -6092,7 +6092,7 @@ dependencies = [ "security-framework", "security-framework-sys", "webpki-root-certs", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -6569,7 +6569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -7065,7 +7065,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix 1.1.4", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] @@ -7504,6 +7504,15 @@ dependencies = [ "x86", ] +[[package]] +name = "uart_16550" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71cceed8939ba6ebde9d1e8a603b3c7f1a239a3db22e1ff465ed71ddca7a7d66" +dependencies = [ + "bitflags 2.11.0", +] + [[package]] name = "uboot-shell" version = "0.2.2" @@ -8002,7 +8011,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] diff --git a/components/axplat_crates/Cargo.lock b/components/axplat_crates/Cargo.lock index 9f093d813..7ca250553 100644 --- a/components/axplat_crates/Cargo.lock +++ b/components/axplat_crates/Cargo.lock @@ -68,7 +68,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d09177e7ffff6c78aee3db4816fb478255c5d579f916d72f914c243b797e68e" dependencies = [ "aarch64-cpu", - "bitflags 2.10.0", + "bitflags 2.11.0", "enum_dispatch", "log", "paste", @@ -167,7 +167,7 @@ name = "axplat" version = "0.3.1-pre.6" dependencies = [ "axplat-macros", - "bitflags 2.10.0", + "bitflags 2.11.0", "const-str", "crate_interface 0.3.0", "handler_table", @@ -294,7 +294,7 @@ dependencies = [ "axconfig-macros", "axcpu", "axplat", - "bitflags 2.10.0", + "bitflags 2.11.0", "heapless", "int_ratio", "kspin", @@ -330,9 +330,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "byteorder" @@ -844,7 +844,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c9f0d275c70310e2a9d2fc23250c5ac826a73fa828a5f256401f85c5c554283" dependencies = [ "bit_field", - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -905,7 +905,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9a63b9b86d32f64c3874a90936939281d045ef1751d0aca3d82d5e4e06b2ef" dependencies = [ "aarch64-cpu", - "bitflags 2.10.0", + "bitflags 2.11.0", "memory_addr", "x86_64", ] @@ -1002,7 +1002,7 @@ version = "11.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" dependencies = [ - "bitflags 2.10.0", + "bitflags 2.11.0", ] [[package]] @@ -1362,13 +1362,11 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "uart_16550" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94d293f51425981fdb1b766beae254dbb711a17e8c4b549dc69b9b7ee0d478d5" +checksum = "71cceed8939ba6ebde9d1e8a603b3c7f1a239a3db22e1ff465ed71ddca7a7d66" dependencies = [ - "bitflags 2.10.0", - "rustversion", - "x86", + "bitflags 2.11.0", ] [[package]] @@ -1474,7 +1472,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7841fa0098ceb15c567d93d3fae292c49e10a7662b4936d5f6a9728594555ba" dependencies = [ "bit_field", - "bitflags 2.10.0", + "bitflags 2.11.0", "const_fn", "rustversion", "volatile", diff --git a/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/Cargo.toml b/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/Cargo.toml index 357f5a5e7..efebc00e5 100644 --- a/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/Cargo.toml +++ b/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/Cargo.toml @@ -24,7 +24,7 @@ lazyinit = "0.2" log = "0.4" loongArch64 = "0.2.4" page_table_entry = "0.6" -uart_16550 = "0.4.0" +uart_16550 = "0.5" axconfig-macros = "0.2" axcpu = { workspace = true } diff --git a/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/src/console.rs b/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/src/console.rs index 06e3cfb2a..a660474e7 100644 --- a/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/src/console.rs +++ b/components/axplat_crates/platforms/axplat-loongarch64-qemu-virt/src/console.rs @@ -1,19 +1,19 @@ -use axplat::{ - console::ConsoleIf, - mem::{pa, phys_to_virt}, -}; +use axplat::console::ConsoleIf; use kspin::SpinNoIrq; use lazyinit::LazyInit; -use uart_16550::MmioSerialPort; +use uart_16550::{Config, Uart16550, backend::MmioBackend}; -use crate::config::devices::UART_PADDR; +use crate::config::{devices::UART_PADDR, plat::PHYS_VIRT_OFFSET}; -static UART: LazyInit> = LazyInit::new(); +static UART: LazyInit>> = LazyInit::new(); pub(crate) fn init_early() { UART.init_once({ - let mut uart = unsafe { MmioSerialPort::new(phys_to_virt(pa!(UART_PADDR)).as_usize()) }; - uart.init(); + let mut uart = + unsafe { Uart16550::new_mmio((UART_PADDR + PHYS_VIRT_OFFSET) as *mut u8, 1) }.unwrap(); + uart.init(Config::default()) + .expect("Failed to initialize UART"); + uart.test_loopback().expect("Failed to test UART loopback"); SpinNoIrq::new(uart) }); } @@ -27,11 +27,8 @@ impl ConsoleIf for ConsoleIfImpl { for &c in bytes { let mut uart = UART.lock(); match c { - b'\n' => { - uart.send_raw(b'\r'); - uart.send_raw(b'\n'); - } - c => uart.send_raw(c), + b'\n' => uart.send_bytes_exact(b"\r\n"), + c => uart.send_bytes_exact(&[c]), } } } @@ -40,15 +37,10 @@ impl ConsoleIf for ConsoleIfImpl { /// Returns the number of bytes read. fn read_bytes(bytes: &mut [u8]) -> usize { let mut uart = UART.lock(); - for (i, byte) in bytes.iter_mut().enumerate() { - match uart.try_receive() { - Ok(c) => *byte = c, - Err(_) => return i, - } - } - bytes.len() + uart.try_receive_bytes(bytes) } + /// Returns the IRQ number for the console, if applicable. #[cfg(feature = "irq")] fn irq_num() -> Option { Some(crate::config::devices::UART_IRQ) diff --git a/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/Cargo.toml b/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/Cargo.toml index 973a66174..126bd8539 100644 --- a/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/Cargo.toml +++ b/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/Cargo.toml @@ -25,7 +25,7 @@ riscv = "0.16" riscv_goldfish = { version = "0.1", optional = true } riscv_plic = { version = "0.2", optional = true } sbi-rt = { version = "0.0.3", features = ["legacy"] } -uart_16550 = "0.4.0" +uart_16550 = "0.5.0" axconfig-macros = "0.2" axcpu = { workspace = true } diff --git a/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/src/console.rs b/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/src/console.rs index 037f5cc6a..a660474e7 100644 --- a/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/src/console.rs +++ b/components/axplat_crates/platforms/axplat-riscv64-qemu-virt/src/console.rs @@ -1,16 +1,19 @@ use axplat::console::ConsoleIf; use kspin::SpinNoIrq; use lazyinit::LazyInit; -use uart_16550::MmioSerialPort; +use uart_16550::{Config, Uart16550, backend::MmioBackend}; use crate::config::{devices::UART_PADDR, plat::PHYS_VIRT_OFFSET}; -static UART: LazyInit> = LazyInit::new(); +static UART: LazyInit>> = LazyInit::new(); pub(crate) fn init_early() { UART.init_once({ - let mut uart = unsafe { MmioSerialPort::new(UART_PADDR + PHYS_VIRT_OFFSET) }; - uart.init(); + let mut uart = + unsafe { Uart16550::new_mmio((UART_PADDR + PHYS_VIRT_OFFSET) as *mut u8, 1) }.unwrap(); + uart.init(Config::default()) + .expect("Failed to initialize UART"); + uart.test_loopback().expect("Failed to test UART loopback"); SpinNoIrq::new(uart) }); } @@ -24,11 +27,8 @@ impl ConsoleIf for ConsoleIfImpl { for &c in bytes { let mut uart = UART.lock(); match c { - b'\n' => { - uart.send_raw(b'\r'); - uart.send_raw(b'\n'); - } - c => uart.send_raw(c), + b'\n' => uart.send_bytes_exact(b"\r\n"), + c => uart.send_bytes_exact(&[c]), } } } @@ -37,13 +37,7 @@ impl ConsoleIf for ConsoleIfImpl { /// Returns the number of bytes read. fn read_bytes(bytes: &mut [u8]) -> usize { let mut uart = UART.lock(); - for (i, byte) in bytes.iter_mut().enumerate() { - match uart.try_receive() { - Ok(c) => *byte = c, - Err(_) => return i, - } - } - bytes.len() + uart.try_receive_bytes(bytes) } /// Returns the IRQ number for the console, if applicable. diff --git a/components/axplat_crates/platforms/axplat-x86-pc/Cargo.toml b/components/axplat_crates/platforms/axplat-x86-pc/Cargo.toml index a2d8d99be..b6717c0fa 100644 --- a/components/axplat_crates/platforms/axplat-x86-pc/Cargo.toml +++ b/components/axplat_crates/platforms/axplat-x86-pc/Cargo.toml @@ -35,7 +35,7 @@ x86_64 = "0.15.2" x2apic = "0.5" multiboot = "0.8" raw-cpuid = "11.5" -uart_16550 = "0.4" +uart_16550 = "0.5" x86_rtc = { version = "0.1", optional = true } [package.metadata.docs.rs] diff --git a/components/axplat_crates/platforms/axplat-x86-pc/src/console.rs b/components/axplat_crates/platforms/axplat-x86-pc/src/console.rs index d94406880..cf37ccfe8 100644 --- a/components/axplat_crates/platforms/axplat-x86-pc/src/console.rs +++ b/components/axplat_crates/platforms/axplat-x86-pc/src/console.rs @@ -1,55 +1,45 @@ -//! Uart 16550 serial port. - use axplat::console::ConsoleIf; use kspin::SpinNoIrq; -use uart_16550::SerialPort; - -static COM1: SpinNoIrq = unsafe { SpinNoIrq::new(SerialPort::new(0x3f8)) }; +use lazyinit::LazyInit; +use uart_16550::{Config, Uart16550, backend::PioBackend}; -/// Writes a byte to the console. -pub fn putchar(c: u8) { - COM1.lock().send(c) -} +const COM1_PORT: u16 = 0x3F8; -/// Reads a byte from the console, or returns [`None`] if no input is available. -pub fn getchar() -> Option { - COM1.lock().try_receive().ok() -} +static UART: LazyInit>> = LazyInit::new(); -pub fn init() { - COM1.lock().init(); +pub(crate) fn init_early() { + UART.init_once({ + let mut uart = unsafe { Uart16550::new_port(COM1_PORT) }.unwrap(); + uart.init(Config::default()) + .expect("Failed to initialize UART"); + uart.test_loopback().expect("Failed to test UART loopback"); + SpinNoIrq::new(uart) + }); } struct ConsoleIfImpl; #[impl_plat_interface] impl ConsoleIf for ConsoleIfImpl { - /// Writes given bytes to the console. + /// Writes bytes to the console from input u8 slice. fn write_bytes(bytes: &[u8]) { - for c in bytes { - putchar(*c); + for &c in bytes { + let mut uart = UART.lock(); + match c { + b'\n' => uart.send_bytes_exact(b"\r\n"), + c => uart.send_bytes_exact(&[c]), + } } } /// Reads bytes from the console into the given mutable slice. - /// /// Returns the number of bytes read. fn read_bytes(bytes: &mut [u8]) -> usize { - let mut read_len = 0; - while read_len < bytes.len() { - if let Some(c) = getchar() { - bytes[read_len] = c; - } else { - break; - } - read_len += 1; - } - read_len + let mut uart = UART.lock(); + uart.try_receive_bytes(bytes) } - /// Returns the IRQ number for the console input interrupt. - /// - /// Returns `None` if input interrupt is not supported. + /// Returns the IRQ number for the console, if applicable. #[cfg(feature = "irq")] fn irq_num() -> Option { None diff --git a/components/axplat_crates/platforms/axplat-x86-pc/src/init.rs b/components/axplat_crates/platforms/axplat-x86-pc/src/init.rs index 15430e692..ff99ce0c4 100644 --- a/components/axplat_crates/platforms/axplat-x86-pc/src/init.rs +++ b/components/axplat_crates/platforms/axplat-x86-pc/src/init.rs @@ -11,7 +11,7 @@ impl InitIf for InitIfImpl { /// early console, clocking). fn init_early(_cpu_id: usize, mbi: usize) { axcpu::init::init_trap(); - crate::console::init(); + crate::console::init_early(); crate::time::init_early(); crate::mem::init(mbi); } diff --git a/components/axplat_crates/platforms/axplat-x86-pc/src/power.rs b/components/axplat_crates/platforms/axplat-x86-pc/src/power.rs index 2af38fb25..75d1d7d89 100644 --- a/components/axplat_crates/platforms/axplat-x86-pc/src/power.rs +++ b/components/axplat_crates/platforms/axplat-x86-pc/src/power.rs @@ -28,7 +28,7 @@ impl PowerIf for PowerImpl { // work. Therefore we use port `0x64` to reboot the system instead. if cfg!(feature = "reboot-on-system-off") { axplat::console_println!("System will reboot, press any key to continue ..."); - while super::console::getchar().is_none() {} + while axplat::console::read_bytes(&mut [0]) == 0 {} axplat::console_println!("Rebooting ..."); unsafe { PortWriteOnly::new(0x64).write(0xfeu8) }; } else {