diff --git a/src/arch/aarch64/device/serial.rs b/src/arch/aarch64/device/serial.rs index a6dd8d6..d4abe9d 100644 --- a/src/arch/aarch64/device/serial.rs +++ b/src/arch/aarch64/device/serial.rs @@ -10,27 +10,27 @@ use crate::paging::{ActivePageTable, Page, PageFlags, PhysicalAddress, TableKind pub static COM1: Mutex> = Mutex::new(None); pub unsafe fn init() { - if let Some(ref mut serial_port) = *COM1.lock() { - return; + if COM1.lock().is_none() { + let (base, size) = device_tree::diag_uart_range(crate::KERNEL_DTB_OFFSET, crate::KERNEL_DTB_MAX_SIZE).unwrap(); + + let mut active_ktable = unsafe { ActivePageTable::new(TableKind::Kernel) }; + let mut flush_all = PageFlushAll::new(); + + let start_frame = Frame::containing_address(PhysicalAddress::new(base)); + let end_frame = Frame::containing_address(PhysicalAddress::new(base + size - 1)); + for frame in Frame::range_inclusive(start_frame, end_frame) { + let page = Page::containing_address(VirtualAddress::new(frame.start_address().data() + crate::KERNEL_DEVMAP_OFFSET)); + let result = active_ktable.map_to(page, frame, PageFlags::new().write(true)); + flush_all.consume(result); + }; + flush_all.flush(); + + let start_frame = Frame::containing_address(PhysicalAddress::new(base)); + let vaddr = start_frame.start_address().data() + crate::KERNEL_DEVMAP_OFFSET; + + *COM1.lock() = Some(SerialPort::new(vaddr)); } - let (base, size) = device_tree::diag_uart_range(crate::KERNEL_DTB_OFFSET, crate::KERNEL_DTB_MAX_SIZE).unwrap(); - let mut active_ktable = unsafe { ActivePageTable::new(TableKind::Kernel) }; - let mut flush_all = PageFlushAll::new(); - - let start_frame = Frame::containing_address(PhysicalAddress::new(base)); - let end_frame = Frame::containing_address(PhysicalAddress::new(base + size - 1)); - for frame in Frame::range_inclusive(start_frame, end_frame) { - let page = Page::containing_address(VirtualAddress::new(frame.start_address().data() + crate::KERNEL_DEVMAP_OFFSET)); - let result = active_ktable.map_to(page, frame, PageFlags::new().write(true)); - flush_all.consume(result); - }; - flush_all.flush(); - - let start_frame = Frame::containing_address(PhysicalAddress::new(base)); - let vaddr = start_frame.start_address().data() + crate::KERNEL_DEVMAP_OFFSET; - - *COM1.lock() = Some(SerialPort::new(vaddr)); if let Some(ref mut serial_port) = *COM1.lock() { serial_port.init(true); }