vmbase: Enter clients with dynamic PTs live
The layout and linker sections of clients are controlled by a linker
script provided by vmbase so the library should know how to replicate
the client-specific static PTs to generate the dynamic PTs. Therefore,
teach vmbase to use the information it gets from the linker to replicate
the client static PTs, with client-agnostic code, and switch to the
dynamic PTs before entering its clients.
Bug: 377276983
Test: m {pvmfw,rialto,vmbase_example_{bios,kernel}}_bin
Test: atest rialto_test vmbase_example.integration_test
Change-Id: I90fa0e62e6e4cb8474f3294633cee775b1191c71
diff --git a/guest/pvmfw/src/memory.rs b/guest/pvmfw/src/memory.rs
index a0d2b14..35bfd3a 100644
--- a/guest/pvmfw/src/memory.rs
+++ b/guest/pvmfw/src/memory.rs
@@ -16,36 +16,17 @@
use crate::entry::RebootReason;
use crate::fdt;
-use aarch64_paging::MapError;
use core::num::NonZeroUsize;
-use core::result;
use core::slice;
use log::debug;
use log::error;
use log::info;
use log::warn;
use vmbase::{
- layout::{self, crosvm},
- memory::{init_shared_pool, map_data, map_rodata, resize_available_memory, PageTable},
+ layout::crosvm,
+ memory::{init_shared_pool, map_data, map_rodata, resize_available_memory},
};
-pub fn init_page_table() -> result::Result<PageTable, MapError> {
- let mut page_table = PageTable::default();
-
- // Stack and scratch ranges are explicitly zeroed and flushed before jumping to payload,
- // so dirty state management can be omitted.
- page_table.map_data(&layout::data_bss_range().into())?;
- page_table.map_data(&layout::eh_stack_range().into())?;
- page_table.map_data(&layout::stack_range().into())?;
- page_table.map_code(&layout::text_range().into())?;
- page_table.map_rodata(&layout::rodata_range().into())?;
- if let Err(e) = page_table.map_device(&layout::console_uart_page().into()) {
- error!("Failed to remap the UART as a dynamic page table entry: {e}");
- return Err(e);
- }
- Ok(page_table)
-}
-
pub(crate) struct MemorySlices<'a> {
pub fdt: &'a mut libfdt::Fdt,
pub kernel: &'a [u8],