vmbase_example: Map PCI & UART only
Only map what we acces, providing better coverage of the PCI DT node.
This removes the need for the hacky dodge of a BreakBeforeMakeViolation.
Bug: 377276983
Bug: 381400830
Test: atest vmbase_example.integration_test
Change-Id: Ia12b60b758799a62ee0df4eec99c64195b1452a9
diff --git a/guest/vmbase_example/src/layout.rs b/guest/vmbase_example/src/layout.rs
index 55c7283..4e87e4e 100644
--- a/guest/vmbase_example/src/layout.rs
+++ b/guest/vmbase_example/src/layout.rs
@@ -14,14 +14,11 @@
//! Memory layout.
-use aarch64_paging::paging::{MemoryRegion, VirtualAddress};
+use aarch64_paging::paging::VirtualAddress;
use core::ops::Range;
use log::info;
use vmbase::{layout, memory::PAGE_SIZE};
-pub const DEVICE_REGION: MemoryRegion =
- MemoryRegion::new(layout::crosvm::MMIO_START, layout::crosvm::MMIO_END);
-
/// Writable data region for the stack.
pub fn boot_stack_range() -> Range<VirtualAddress> {
layout::stack_range(40 * PAGE_SIZE)
diff --git a/guest/vmbase_example/src/main.rs b/guest/vmbase_example/src/main.rs
index 1466d1e..c7ef061 100644
--- a/guest/vmbase_example/src/main.rs
+++ b/guest/vmbase_example/src/main.rs
@@ -23,8 +23,8 @@
extern crate alloc;
-use crate::layout::{boot_stack_range, print_addresses, DEVICE_REGION};
-use crate::pci::{check_pci, get_bar_region};
+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 aarch64_paging::MapError;
use alloc::{vec, vec::Vec};
@@ -37,10 +37,9 @@
bionic, configure_heap,
fdt::pci::PciInfo,
generate_image_header,
- layout::{crosvm::FDT_MAX_SIZE, rodata_range, scratch_range, text_range},
+ layout::{console_uart_page, crosvm::FDT_MAX_SIZE, rodata_range, scratch_range, text_range},
linker, logger, main,
memory::{PageTable, SIZE_64KB},
- util::RangeExt as _,
};
static INITIALISED_DATA: [u32; 4] = [1, 2, 3, 4];
@@ -52,7 +51,7 @@
configure_heap!(SIZE_64KB);
fn init_page_table(page_table: &mut PageTable) -> Result<(), MapError> {
- page_table.map_device(&DEVICE_REGION)?;
+ 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(&scratch_range().into())?;
@@ -99,13 +98,10 @@
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);
- if bar_region.is_within(&DEVICE_REGION) {
- // Avoid a MapError::BreakBeforeMakeViolation.
- info!("BAR region is within already mapped device region: skipping page table ops.");
- } else {
- page_table.map_device(&bar_region).unwrap();
- }
+ page_table.map_device(&bar_region).unwrap();
check_data();
check_dice();
diff --git a/guest/vmbase_example/src/pci.rs b/guest/vmbase_example/src/pci.rs
index 563f24a..379425d 100644
--- a/guest/vmbase_example/src/pci.rs
+++ b/guest/vmbase_example/src/pci.rs
@@ -120,6 +120,11 @@
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