[pvmfw][rialto] Refactor and reuse console_uart_range()
This cl:
- Extracts console_uart_range() into a function and moves it to vmbase.
There is no behavior change for pvmfw.
- Allocates device memory for UART range in rialto.
Bug: 284462758
Test: m pvmfw_img && atest rialto_test
Change-Id: I7f38e7c91869692ed535d00d62713f5be6b8f8ab
diff --git a/pvmfw/src/entry.rs b/pvmfw/src/entry.rs
index 08f076b..8cdd0f5 100644
--- a/pvmfw/src/entry.rs
+++ b/pvmfw/src/entry.rs
@@ -207,18 +207,10 @@
// script prevents it from overlapping with other objects.
let appended_data = unsafe { get_appended_data_slice() };
- let mut page_table = memory::init_page_table().map_err(|e| {
+ let page_table = memory::init_page_table().map_err(|e| {
error!("Failed to set up the dynamic page tables: {e}");
RebootReason::InternalError
})?;
-
- const CONSOLE_LEN: usize = 1; // vmbase::uart::Uart only uses one u8 register.
- let uart_range = console::BASE_ADDRESS..(console::BASE_ADDRESS + CONSOLE_LEN);
- page_table.map_device(&uart_range).map_err(|e| {
- error!("Failed to remap the UART as a dynamic page table entry: {e}");
- RebootReason::InternalError
- })?;
-
// SAFETY - We only get the appended payload from here, once. It is statically mapped and the
// linker script prevents it from overlapping with other objects.
let mut appended = unsafe { AppendedPayload::new(appended_data) }.ok_or_else(|| {
diff --git a/pvmfw/src/memory.rs b/pvmfw/src/memory.rs
index d4e548b..f4fc3b1 100644
--- a/pvmfw/src/memory.rs
+++ b/pvmfw/src/memory.rs
@@ -640,6 +640,9 @@
page_table.map_code(&layout::text_range())?;
page_table.map_rodata(&layout::rodata_range())?;
page_table.map_data_dbm(&appended_payload_range())?;
-
+ if let Err(e) = page_table.map_device(&layout::console_uart_range()) {
+ error!("Failed to remap the UART as a dynamic page table entry: {e}");
+ return Err(e);
+ }
Ok(page_table)
}
diff --git a/rialto/src/main.rs b/rialto/src/main.rs
index 77999fb..30bc5b0 100644
--- a/rialto/src/main.rs
+++ b/rialto/src/main.rs
@@ -63,6 +63,7 @@
page_table.map_data(&layout::stack_range(40 * SZ_4K))?;
page_table.map_code(&layout::text_range())?;
page_table.map_rodata(&layout::rodata_range())?;
+ page_table.map_device(&layout::console_uart_range())?;
// SAFETY: It is safe to activate the page table by setting `TTBR0_EL1` to point to
// it as this is the first time we activate the page table.
diff --git a/vmbase/src/layout.rs b/vmbase/src/layout.rs
index ead4f8e..43bcb2c 100644
--- a/vmbase/src/layout.rs
+++ b/vmbase/src/layout.rs
@@ -14,6 +14,7 @@
//! Memory layout.
+use crate::console::BASE_ADDRESS;
use core::ops::Range;
use core::ptr::addr_of;
@@ -75,6 +76,13 @@
linker_region!(eh_stack_limit, bss_end)
}
+/// UART console range.
+pub fn console_uart_range() -> Range<usize> {
+ const CONSOLE_LEN: usize = 1; // `uart::Uart` only uses one u8 register.
+
+ BASE_ADDRESS..(BASE_ADDRESS + CONSOLE_LEN)
+}
+
/// Read-write data (original).
pub fn data_load_address() -> usize {
linker_addr!(data_lma)