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