Merge "[rialto] Unmap UART in the end of main() execution"
diff --git a/pvmfw/src/exceptions.rs b/pvmfw/src/exceptions.rs
index a10c300..4d376cd 100644
--- a/pvmfw/src/exceptions.rs
+++ b/pvmfw/src/exceptions.rs
@@ -14,11 +14,11 @@
//! Exception handlers.
-use crate::memory::{MemoryTrackerError, MEMORY};
+use crate::memory::MEMORY;
use core::fmt;
use vmbase::console;
use vmbase::logger;
-use vmbase::memory::page_4kb_of;
+use vmbase::memory::{page_4kb_of, MemoryTrackerError};
use vmbase::read_sysreg;
use vmbase::{eprintln, power::reboot};
diff --git a/pvmfw/src/memory.rs b/pvmfw/src/memory.rs
index fa2d56b..c34afc9 100644
--- a/pvmfw/src/memory.rs
+++ b/pvmfw/src/memory.rs
@@ -22,7 +22,6 @@
use alloc::boxed::Box;
use buddy_system_allocator::LockedFrameAllocator;
use core::alloc::Layout;
-use core::fmt;
use core::iter::once;
use core::num::NonZeroUsize;
use core::ops::Range;
@@ -38,7 +37,7 @@
dsb, layout,
memory::{
flush_dirty_range, mark_dirty_block, mmio_guard_unmap_page, page_4kb_of, set_dbm_enabled,
- verify_lazy_mapped_block, MemorySharer, PageTable, SIZE_2MB, SIZE_4KB,
+ verify_lazy_mapped_block, MemorySharer, MemoryTrackerError, PageTable, SIZE_2MB, SIZE_4KB,
},
util::{align_up, RangeExt as _},
};
@@ -74,66 +73,6 @@
payload_range: MemoryRange,
}
-/// Errors for MemoryTracker operations.
-#[derive(Debug, Clone)]
-pub enum MemoryTrackerError {
- /// Tried to modify the memory base address.
- DifferentBaseAddress,
- /// Tried to shrink to a larger memory size.
- SizeTooLarge,
- /// Tracked regions would not fit in memory size.
- SizeTooSmall,
- /// Reached limit number of tracked regions.
- Full,
- /// Region is out of the tracked memory address space.
- OutOfRange,
- /// New region overlaps with tracked regions.
- Overlaps,
- /// Region couldn't be mapped.
- FailedToMap,
- /// Region couldn't be unmapped.
- FailedToUnmap,
- /// Error from the interaction with the hypervisor.
- Hypervisor(hyp::Error),
- /// Failure to set `SHARED_MEMORY`.
- SharedMemorySetFailure,
- /// Failure to set `SHARED_POOL`.
- SharedPoolSetFailure,
- /// Invalid page table entry.
- InvalidPte,
- /// Failed to flush memory region.
- FlushRegionFailed,
- /// Failed to set PTE dirty state.
- SetPteDirtyFailed,
-}
-
-impl fmt::Display for MemoryTrackerError {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- match self {
- Self::DifferentBaseAddress => write!(f, "Received different base address"),
- Self::SizeTooLarge => write!(f, "Tried to shrink to a larger memory size"),
- Self::SizeTooSmall => write!(f, "Tracked regions would not fit in memory size"),
- Self::Full => write!(f, "Reached limit number of tracked regions"),
- Self::OutOfRange => write!(f, "Region is out of the tracked memory address space"),
- Self::Overlaps => write!(f, "New region overlaps with tracked regions"),
- Self::FailedToMap => write!(f, "Failed to map the new region"),
- Self::FailedToUnmap => write!(f, "Failed to unmap the new region"),
- Self::Hypervisor(e) => e.fmt(f),
- Self::SharedMemorySetFailure => write!(f, "Failed to set SHARED_MEMORY"),
- Self::SharedPoolSetFailure => write!(f, "Failed to set SHARED_POOL"),
- Self::InvalidPte => write!(f, "Page table entry is not valid"),
- Self::FlushRegionFailed => write!(f, "Failed to flush memory region"),
- Self::SetPteDirtyFailed => write!(f, "Failed to set PTE dirty state"),
- }
- }
-}
-
-impl From<hyp::Error> for MemoryTrackerError {
- fn from(e: hyp::Error) -> Self {
- Self::Hypervisor(e)
- }
-}
-
type Result<T> = result::Result<T, MemoryTrackerError>;
static SHARED_POOL: OnceBox<LockedFrameAllocator<32>> = OnceBox::new();
diff --git a/vmbase/src/memory/error.rs b/vmbase/src/memory/error.rs
new file mode 100644
index 0000000..273db56
--- /dev/null
+++ b/vmbase/src/memory/error.rs
@@ -0,0 +1,77 @@
+// Copyright 2023, The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+//! Error relating to memory management.
+
+use core::fmt;
+
+/// Errors for MemoryTracker operations.
+#[derive(Debug, Clone)]
+pub enum MemoryTrackerError {
+ /// Tried to modify the memory base address.
+ DifferentBaseAddress,
+ /// Tried to shrink to a larger memory size.
+ SizeTooLarge,
+ /// Tracked regions would not fit in memory size.
+ SizeTooSmall,
+ /// Reached limit number of tracked regions.
+ Full,
+ /// Region is out of the tracked memory address space.
+ OutOfRange,
+ /// New region overlaps with tracked regions.
+ Overlaps,
+ /// Region couldn't be mapped.
+ FailedToMap,
+ /// Region couldn't be unmapped.
+ FailedToUnmap,
+ /// Error from the interaction with the hypervisor.
+ Hypervisor(hyp::Error),
+ /// Failure to set `SHARED_MEMORY`.
+ SharedMemorySetFailure,
+ /// Failure to set `SHARED_POOL`.
+ SharedPoolSetFailure,
+ /// Invalid page table entry.
+ InvalidPte,
+ /// Failed to flush memory region.
+ FlushRegionFailed,
+ /// Failed to set PTE dirty state.
+ SetPteDirtyFailed,
+}
+
+impl fmt::Display for MemoryTrackerError {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self {
+ Self::DifferentBaseAddress => write!(f, "Received different base address"),
+ Self::SizeTooLarge => write!(f, "Tried to shrink to a larger memory size"),
+ Self::SizeTooSmall => write!(f, "Tracked regions would not fit in memory size"),
+ Self::Full => write!(f, "Reached limit number of tracked regions"),
+ Self::OutOfRange => write!(f, "Region is out of the tracked memory address space"),
+ Self::Overlaps => write!(f, "New region overlaps with tracked regions"),
+ Self::FailedToMap => write!(f, "Failed to map the new region"),
+ Self::FailedToUnmap => write!(f, "Failed to unmap the new region"),
+ Self::Hypervisor(e) => e.fmt(f),
+ Self::SharedMemorySetFailure => write!(f, "Failed to set SHARED_MEMORY"),
+ Self::SharedPoolSetFailure => write!(f, "Failed to set SHARED_POOL"),
+ Self::InvalidPte => write!(f, "Page table entry is not valid"),
+ Self::FlushRegionFailed => write!(f, "Failed to flush memory region"),
+ Self::SetPteDirtyFailed => write!(f, "Failed to set PTE dirty state"),
+ }
+ }
+}
+
+impl From<hyp::Error> for MemoryTrackerError {
+ fn from(e: hyp::Error) -> Self {
+ Self::Hypervisor(e)
+ }
+}
diff --git a/vmbase/src/memory/mod.rs b/vmbase/src/memory/mod.rs
index c4a54f2..f919bcd 100644
--- a/vmbase/src/memory/mod.rs
+++ b/vmbase/src/memory/mod.rs
@@ -15,11 +15,13 @@
//! Memory management.
mod dbm;
+mod error;
mod page_table;
mod shared;
mod util;
pub use dbm::{flush_dirty_range, mark_dirty_block, set_dbm_enabled};
+pub use error::MemoryTrackerError;
pub use page_table::PageTable;
pub use shared::{mmio_guard_unmap_page, verify_lazy_mapped_block, MemorySharer};
pub use util::{