vmbase: Move handle_*_fault() to crate::exceptions
Move the functions out of vmbase::memory::shared.
Fix the visibility of the corresponding MemoryTracker methods.
Note: no functional change intended.
Test: m pvmfw_bin rialto_bin
Bug: 377276983
Change-Id: I56f273e5ca5d8d544248aa4c695c9d535b6c8b0a
diff --git a/guest/pvmfw/src/exceptions.rs b/guest/pvmfw/src/exceptions.rs
index d9f0891..c16e637 100644
--- a/guest/pvmfw/src/exceptions.rs
+++ b/guest/pvmfw/src/exceptions.rs
@@ -16,9 +16,9 @@
use vmbase::{
eprintln,
+ exceptions::{handle_permission_fault, handle_translation_fault},
exceptions::{ArmException, Esr, HandleExceptionError},
logger,
- memory::{handle_permission_fault, handle_translation_fault},
power::reboot,
read_sysreg,
};
diff --git a/guest/rialto/src/exceptions.rs b/guest/rialto/src/exceptions.rs
index e87e0d3..8899796 100644
--- a/guest/rialto/src/exceptions.rs
+++ b/guest/rialto/src/exceptions.rs
@@ -16,9 +16,9 @@
use vmbase::{
eprintln,
+ exceptions::{handle_permission_fault, handle_translation_fault},
exceptions::{ArmException, Esr, HandleExceptionError},
logger,
- memory::{handle_permission_fault, handle_translation_fault},
power::reboot,
read_sysreg,
};
diff --git a/libs/libvmbase/src/exceptions.rs b/libs/libvmbase/src/exceptions.rs
index 11fcd93..b04cb16 100644
--- a/libs/libvmbase/src/exceptions.rs
+++ b/libs/libvmbase/src/exceptions.rs
@@ -17,11 +17,12 @@
use crate::{
eprintln,
layout::UART_PAGE_ADDR,
- memory::{page_4kb_of, MemoryTrackerError},
+ memory::{page_4kb_of, MemoryTrackerError, MEMORY},
read_sysreg,
};
use aarch64_paging::paging::VirtualAddress;
use core::fmt;
+use core::result;
/// Represents an error that can occur while handling an exception.
#[derive(Debug)]
@@ -136,3 +137,19 @@
self.esr == Esr::DataAbortSyncExternalAbort && page_4kb_of(self.far.0) == UART_PAGE_ADDR
}
}
+
+/// Handles a translation fault with the given fault address register (FAR).
+#[inline]
+pub fn handle_translation_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
+ let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
+ let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
+ Ok(memory.handle_mmio_fault(far)?)
+}
+
+/// Handles a permission fault with the given fault address register (FAR).
+#[inline]
+pub fn handle_permission_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
+ let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
+ let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
+ Ok(memory.handle_permission_fault(far)?)
+}
diff --git a/libs/libvmbase/src/memory.rs b/libs/libvmbase/src/memory.rs
index 299d50f..8baf6ca 100644
--- a/libs/libvmbase/src/memory.rs
+++ b/libs/libvmbase/src/memory.rs
@@ -22,9 +22,7 @@
pub use error::MemoryTrackerError;
pub use page_table::PageTable;
-pub use shared::{
- handle_permission_fault, handle_translation_fault, MemoryRange, MemoryTracker, MEMORY,
-};
+pub use shared::{MemoryRange, MemoryTracker, MEMORY};
pub use util::{
flush, flushed_zeroize, min_dcache_line_size, page_4kb_of, PAGE_SIZE, SIZE_128KB, SIZE_16KB,
SIZE_2MB, SIZE_4KB, SIZE_4MB, SIZE_64KB,
diff --git a/libs/libvmbase/src/memory/shared.rs b/libs/libvmbase/src/memory/shared.rs
index d869b16..3747e2f 100644
--- a/libs/libvmbase/src/memory/shared.rs
+++ b/libs/libvmbase/src/memory/shared.rs
@@ -19,7 +19,6 @@
use super::page_table::{PageTable, MMIO_LAZY_MAP_FLAG};
use super::util::virt_to_phys;
use crate::dsb;
-use crate::exceptions::HandleExceptionError;
use crate::hyp::{self, get_mem_sharer, get_mmio_guard};
use crate::layout;
use crate::util::unchecked_align_down;
@@ -317,7 +316,7 @@
/// Handles translation fault for blocks flagged for lazy MMIO mapping by enabling the page
/// table entry and MMIO guard mapping the block. Breaks apart a block entry if required.
- fn handle_mmio_fault(&mut self, addr: VirtualAddress) -> Result<()> {
+ pub(crate) fn handle_mmio_fault(&mut self, addr: VirtualAddress) -> Result<()> {
let shared_range = self.mmio_sharer.share(addr)?;
self.map_lazy_mmio_as_valid(&shared_range)?;
@@ -364,7 +363,7 @@
/// Handles permission fault for read-only blocks by setting writable-dirty state.
/// In general, this should be called from the exception handler when hardware dirty
/// state management is disabled or unavailable.
- fn handle_permission_fault(&mut self, addr: VirtualAddress) -> Result<()> {
+ pub(crate) fn handle_permission_fault(&mut self, addr: VirtualAddress) -> Result<()> {
self.page_table
.modify_range(&(addr..addr + 1).into(), &mark_dirty_block)
.map_err(|_| MemoryTrackerError::SetPteDirtyFailed)
@@ -546,19 +545,3 @@
}
}
}
-
-/// Handles a translation fault with the given fault address register (FAR).
-#[inline]
-pub fn handle_translation_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
- let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
- let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
- Ok(memory.handle_mmio_fault(far)?)
-}
-
-/// Handles a permission fault with the given fault address register (FAR).
-#[inline]
-pub fn handle_permission_fault(far: VirtualAddress) -> result::Result<(), HandleExceptionError> {
- let mut guard = MEMORY.try_lock().ok_or(HandleExceptionError::PageTableUnavailable)?;
- let memory = guard.as_mut().ok_or(HandleExceptionError::PageTableNotInitialized)?;
- Ok(memory.handle_permission_fault(far)?)
-}