From 7f92ecc3b1dd01dd12c72ba17bc8bf1652495d2c Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Wed, 13 May 2026 15:50:37 +0800 Subject: feat: enhance UART driver and FDT parser with MMU support and default UART settings --- na/drivers/uart.cc | 16 +++++++++++++--- na/fdt/fdt.cc | 12 +++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/na/drivers/uart.cc b/na/drivers/uart.cc index 2e553d6..264ec6a 100644 --- a/na/drivers/uart.cc +++ b/na/drivers/uart.cc @@ -16,6 +16,11 @@ static uint64 g_uart_pa = 0; static uint64 g_uart_size = 0; static bool g_runtime_mapping_ready = false; +static bool g_mmu_enabled = false; + +extern "C" void console_set_mmu_enabled() { + g_mmu_enabled = true; +} extern "C" void early_putc(char c) { if (!g_uart_pa) return; @@ -25,9 +30,14 @@ extern "C" void early_putc(char c) { * reachable via the bootstrap fixed direct map from entry.S. * After activation, switch to the runtime (possibly KASLR-slid) base. */ - uint64 uart_va = g_runtime_mapping_ready - ? pa_to_va(phys_addr(g_uart_pa)).raw - : boot_pa_to_va(phys_addr(g_uart_pa)).raw; + uint64 uart_va = 0; + if (g_runtime_mapping_ready) { + uart_va = pa_to_va(phys_addr(g_uart_pa)).raw; + } else if (!g_mmu_enabled) { + uart_va = g_uart_pa; + } else { + uart_va = boot_pa_to_va(phys_addr(g_uart_pa)).raw; + } volatile auto* uart = reinterpret_cast(uart_va); *uart = static_cast(c); diff --git a/na/fdt/fdt.cc b/na/fdt/fdt.cc index fbec245..d44ebda 100644 --- a/na/fdt/fdt.cc +++ b/na/fdt/fdt.cc @@ -247,9 +247,16 @@ void FdtManager::early_scan_uart(uint64 fdt_paddr, uint64 *uart_addr, if (!uart_addr || !uart_size) return; + auto set_default_uart = [uart_addr, uart_size]() { + *uart_addr = 0x10000000ULL; + *uart_size = 0x100; + }; + const fdt_header *hdr = reinterpret_cast(fdt_paddr); - if (bswap32(hdr->magic) != FDT_MAGIC) + if (bswap32(hdr->magic) != FDT_MAGIC) { + set_default_uart(); return; + } const uint8 *dt_struct = reinterpret_cast(fdt_paddr) + bswap32(hdr->off_dt_struct); @@ -343,8 +350,7 @@ void FdtManager::early_scan_uart(uint64 fdt_paddr, uint64 *uart_addr, } } - *uart_addr = 0; - *uart_size = 0; + set_default_uart(); } /* ------------------------------------------------------------------ */ -- cgit v1.2.3