vmbase_example: Upgrade to new vmbase::memory API
Replace direct manipulations of the PTs with the new API.
Replace DIY PCI initialization with the vmbase routine.
Bug: 377276983
Bug: 381400830
Test: atest vmbase_example.integration_test
Change-Id: Iefc5407091e405d5ffd25854bca820e63a0fd6d0
diff --git a/guest/vmbase_example/src/main.rs b/guest/vmbase_example/src/main.rs
index f00effa..3bcc072 100644
--- a/guest/vmbase_example/src/main.rs
+++ b/guest/vmbase_example/src/main.rs
@@ -24,11 +24,9 @@
extern crate alloc;
use crate::layout::{boot_stack_range, print_addresses};
-use crate::pci::{check_pci, get_bar_region, get_cam_region};
-use aarch64_paging::paging::VirtualAddress;
+use crate::pci::check_pci;
use aarch64_paging::MapError;
use alloc::{vec, vec::Vec};
-use core::mem;
use core::ptr::addr_of_mut;
use cstr::cstr;
use libfdt::Fdt;
@@ -42,7 +40,10 @@
text_range,
},
linker, logger, main,
- memory::{PageTable, SIZE_64KB},
+ memory::{
+ deactivate_dynamic_page_tables, map_data, switch_to_dynamic_page_tables, PageTable,
+ SIZE_64KB,
+ },
};
static INITIALISED_DATA: [u32; 4] = [1, 2, 3, 4];
@@ -61,14 +62,6 @@
page_table.map_data(&eh_stack_range().into())?;
page_table.map_data(&boot_stack_range().into())?;
- info!("Activating IdMap...");
- // SAFETY: page_table duplicates the static mappings for everything that the Rust code is
- // aware of so activating it shouldn't have any visible effect.
- unsafe {
- page_table.activate();
- }
- info!("Activated.");
-
Ok(())
}
@@ -84,13 +77,15 @@
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.
let fdt = unsafe { core::slice::from_raw_parts_mut(fdt_addr as *mut u8, FDT_MAX_SIZE) };
- let fdt_region = (VirtualAddress(fdt_addr)..VirtualAddress(fdt_addr + fdt.len())).into();
- page_table.map_data(&fdt_region).unwrap();
+ map_data(fdt_addr, FDT_MAX_SIZE.try_into().unwrap()).unwrap();
let fdt = Fdt::from_mut_slice(fdt).unwrap();
info!("FDT passed verification.");
check_fdt(fdt);
@@ -101,23 +96,16 @@
modify_fdt(fdt);
check_alloc();
-
- let cam_region = get_cam_region(&pci_info);
- page_table.map_device(&cam_region).unwrap();
- let bar_region = get_bar_region(&pci_info);
- page_table.map_device(&bar_region).unwrap();
-
check_data();
check_dice();
- // SAFETY: This is the only place where `make_pci_root` is called.
- let mut pci_root = unsafe { pci_info.make_pci_root() };
+ let mut pci_root = vmbase::virtio::pci::initialize(pci_info).unwrap();
check_pci(&mut pci_root);
emit_suppressed_log();
info!("De-activating IdMap...");
- mem::drop(page_table); // Release PageTable and switch back to idmap.S
+ deactivate_dynamic_page_tables();
info!("De-activated.");
}
diff --git a/guest/vmbase_example/src/pci.rs b/guest/vmbase_example/src/pci.rs
index 379425d..32ab9f6 100644
--- a/guest/vmbase_example/src/pci.rs
+++ b/guest/vmbase_example/src/pci.rs
@@ -14,7 +14,6 @@
//! Functions to scan the PCI bus for VirtIO device.
-use aarch64_paging::paging::MemoryRegion;
use alloc::alloc::{alloc_zeroed, dealloc, handle_alloc_error, Layout};
use core::{mem::size_of, ptr::NonNull};
use log::{debug, info};
@@ -26,10 +25,7 @@
},
BufferDirection, Error, Hal, PhysAddr, PAGE_SIZE,
};
-use vmbase::{
- fdt::pci::PciInfo,
- virtio::pci::{self, PciTransportIterator},
-};
+use vmbase::virtio::pci::{self, PciTransportIterator};
/// The standard sector size of a VirtIO block device, in bytes.
const SECTOR_SIZE_BYTES: usize = 512;
@@ -115,16 +111,6 @@
info!("Wrote to VirtIO console.");
}
-/// Gets the memory region in which BARs are allocated.
-pub fn get_bar_region(pci_info: &PciInfo) -> MemoryRegion {
- MemoryRegion::new(pci_info.bar_range.start as usize, pci_info.bar_range.end as usize)
-}
-
-/// Gets the PCI CAM memory region.
-pub fn get_cam_region(pci_info: &PciInfo) -> MemoryRegion {
- MemoryRegion::new(pci_info.cam_range.start, pci_info.cam_range.end)
-}
-
struct HalImpl;
/// SAFETY: See the 'Implementation Safety' comments on methods below for how they fulfill the