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/vmbase_example/src/main.rs b/guest/vmbase_example/src/main.rs
index 138c90e..4c5e880 100644
--- a/guest/vmbase_example/src/main.rs
+++ b/guest/vmbase_example/src/main.rs
@@ -25,7 +25,6 @@
use crate::layout::print_addresses;
use crate::pci::check_pci;
-use aarch64_paging::MapError;
use alloc::{vec, vec::Vec};
use core::ptr::addr_of_mut;
use cstr::cstr;
@@ -35,15 +34,9 @@
bionic, configure_heap,
fdt::pci::PciInfo,
generate_image_header,
- layout::{
- console_uart_page, crosvm::FDT_MAX_SIZE, data_bss_range, eh_stack_range, rodata_range,
- stack_range, text_range,
- },
+ layout::crosvm::FDT_MAX_SIZE,
linker, logger, main,
- memory::{
- deactivate_dynamic_page_tables, map_data, switch_to_dynamic_page_tables, PageTable,
- SIZE_64KB,
- },
+ memory::{deactivate_dynamic_page_tables, map_data, SIZE_64KB},
};
static INITIALISED_DATA: [u32; 4] = [1, 2, 3, 4];
@@ -54,17 +47,6 @@
main!(main);
configure_heap!(SIZE_64KB);
-fn init_page_table(page_table: &mut PageTable) -> Result<(), MapError> {
- page_table.map_device(&console_uart_page().into())?;
- page_table.map_code(&text_range().into())?;
- page_table.map_rodata(&rodata_range().into())?;
- page_table.map_data(&data_bss_range().into())?;
- page_table.map_data(&eh_stack_range().into())?;
- page_table.map_data(&stack_range().into())?;
-
- Ok(())
-}
-
/// Entry point for VM bootloader.
pub fn main(arg0: u64, arg1: u64, arg2: u64, arg3: u64) {
log::set_max_level(LevelFilter::Debug);
@@ -75,12 +57,6 @@
check_data();
check_stack_guard();
- let mut page_table = PageTable::default();
- init_page_table(&mut page_table).unwrap();
- info!("Activating IdMap...");
- switch_to_dynamic_page_tables(page_table);
- info!("Activated.");
-
info!("Checking FDT...");
let fdt_addr = usize::try_from(arg0).unwrap();
// SAFETY: The DTB range is valid, writable memory, and we don't construct any aliases to it.