From de8ddbf9c2ccbadf2ea48b20801e515db618734f Mon Sep 17 00:00:00 2001 From: bunnie Date: Mon, 21 Jul 2025 17:07:28 +0800 Subject: [PATCH] handle case where uart is re-allocated by the kernel this case happens when the loader is instructed to pre-allocate the kernel UART page based on the early-printk feature. --- kernel/src/platform/precursor/uart.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/kernel/src/platform/precursor/uart.rs b/kernel/src/platform/precursor/uart.rs index f57f24f98..d38b45636 100644 --- a/kernel/src/platform/precursor/uart.rs +++ b/kernel/src/platform/precursor/uart.rs @@ -69,16 +69,22 @@ impl SerialRead for Uart { pub fn init() { // Map the UART peripheral. MemoryManager::with_mut(|memory_manager| { - memory_manager - .map_range( - utra::uart::HW_UART_BASE as *mut u8, - (UART_ADDR & !4095) as *mut u8, - 4096, - PID::new(1).unwrap(), - MemoryFlags::R | MemoryFlags::W, - MemoryType::Default, - ) - .expect("unable to map serial port") + match memory_manager.map_range( + utra::uart::HW_UART_BASE as *mut u8, + (UART_ADDR & !4095) as *mut u8, + 4096, + PID::new(1).unwrap(), + MemoryFlags::R | MemoryFlags::W, + MemoryType::Default, + ) { + Err(xous_kernel::Error::MemoryInUse) => { + klog!("Kernel uart already allocated by loader. No need to re-allocate."); + } + Ok(_) => {} + _ => { + panic!("Couldn't allocate kernel UART"); + } + } }); let mut uart = Uart::new(UART_ADDR, process_characters);