pvmfw: Issue MMIO_GUARD_UNMAP for UART
Ensure that the platform has been put back in its initial state by
unmapping the MMIO page that pvmfw used for logging.
Test: atest MicrodroidTestApp # currently broken without aosp/2238683
Change-Id: I65a4804efb739d1f5fe64c8f55dae758933471a6
diff --git a/pvmfw/src/entry.rs b/pvmfw/src/entry.rs
index a606462..99c67fb 100644
--- a/pvmfw/src/entry.rs
+++ b/pvmfw/src/entry.rs
@@ -18,7 +18,7 @@
use crate::mmio_guard;
use core::arch::asm;
use core::slice;
-use log::{debug, LevelFilter};
+use log::{debug, error, LevelFilter};
use vmbase::{console, logger, main, power::reboot};
#[derive(Debug, Clone)]
@@ -77,6 +77,11 @@
// This wrapper allows main() to be blissfully ignorant of platform details.
crate::main(fdt, payload);
+ mmio_guard::unmap(console::BASE_ADDRESS).map_err(|e| {
+ error!("Failed to unshare the UART: {e}");
+ RebootReason::InternalError
+ })?;
+
Ok(())
}
diff --git a/pvmfw/src/mmio_guard.rs b/pvmfw/src/mmio_guard.rs
index 421f2c4..2206052 100644
--- a/pvmfw/src/mmio_guard.rs
+++ b/pvmfw/src/mmio_guard.rs
@@ -26,6 +26,8 @@
InfoFailed(smccc::Error),
/// Failed to MMIO_GUARD_MAP a page.
MapFailed(smccc::Error),
+ /// Failed to MMIO_GUARD_UNMAP a page.
+ UnmapFailed(smccc::Error),
/// The MMIO_GUARD granule used by the hypervisor is not supported.
UnsupportedGranule(usize),
}
@@ -38,6 +40,7 @@
Self::EnrollFailed(e) => write!(f, "Failed to enroll into MMIO_GUARD: {e}"),
Self::InfoFailed(e) => write!(f, "Failed to get the MMIO_GUARD granule: {e}"),
Self::MapFailed(e) => write!(f, "Failed to MMIO_GUARD map: {e}"),
+ Self::UnmapFailed(e) => write!(f, "Failed to MMIO_GUARD unmap: {e}"),
Self::UnsupportedGranule(g) => write!(f, "Unsupported MMIO_GUARD granule: {g}"),
}
}
@@ -56,6 +59,10 @@
mmio_guard_map(helpers::page_4kb_of(addr) as u64).map_err(Error::MapFailed)
}
+pub fn unmap(addr: usize) -> Result<()> {
+ mmio_guard_unmap(helpers::page_4kb_of(addr) as u64).map_err(Error::UnmapFailed)
+}
+
fn mmio_guard_info() -> smccc::Result<u64> {
const VENDOR_HYP_KVM_MMIO_GUARD_INFO_FUNC_ID: u32 = 0xc6000005;
let args = [0u64; 17];
@@ -77,3 +84,11 @@
smccc::checked_hvc64_expect_zero(VENDOR_HYP_KVM_MMIO_GUARD_MAP_FUNC_ID, args)
}
+
+fn mmio_guard_unmap(ipa: u64) -> smccc::Result<()> {
+ const VENDOR_HYP_KVM_MMIO_GUARD_UNMAP_FUNC_ID: u32 = 0xc6000008;
+ let mut args = [0u64; 17];
+ args[0] = ipa;
+
+ smccc::checked_hvc64_expect_zero(VENDOR_HYP_KVM_MMIO_GUARD_UNMAP_FUNC_ID, args)
+}