diff --git a/libs/libvmbase/src/entry.rs b/libs/libvmbase/src/entry.rs
index f442a32..2433722 100644
--- a/libs/libvmbase/src/entry.rs
+++ b/libs/libvmbase/src/entry.rs
@@ -15,7 +15,7 @@
 //! Rust entry point.
 
 use crate::{
-    bionic, console, heap, hyp,
+    bionic, console, heap,
     layout::{UART_ADDRESSES, UART_PAGE_ADDR},
     logger,
     memory::{PAGE_SIZE, SIZE_16KB, SIZE_4KB},
@@ -23,10 +23,11 @@
     rand,
 };
 use core::mem::size_of;
+use hypervisor_backends::{get_mmio_guard, Error};
 use static_assertions::const_assert_eq;
 
-fn try_console_init() -> Result<(), hyp::Error> {
-    if let Some(mmio_guard) = hyp::get_mmio_guard() {
+fn try_console_init() -> Result<(), Error> {
+    if let Some(mmio_guard) = get_mmio_guard() {
         mmio_guard.enroll()?;
 
         // TODO(ptosi): Use MmioSharer::share() to properly track this MMIO_GUARD_MAP.
diff --git a/libs/libvmbase/src/hyp.rs b/libs/libvmbase/src/hyp.rs
deleted file mode 100644
index 1cc2ca7..0000000
--- a/libs/libvmbase/src/hyp.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-// 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.
-
-//! This library provides wrappers around various hypervisor backends.
-
-mod error;
-mod hypervisor;
-
-pub use error::{Error, Result};
-pub use hypervisor::{
-    get_device_assigner, get_mem_sharer, get_mmio_guard, DeviceAssigningHypervisor, KvmError,
-};
diff --git a/libs/libvmbase/src/hyp/error.rs b/libs/libvmbase/src/hyp/error.rs
deleted file mode 100644
index e9c37e1..0000000
--- a/libs/libvmbase/src/hyp/error.rs
+++ /dev/null
@@ -1,56 +0,0 @@
-// 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 and Result types for hypervisor.
-
-use core::{fmt, result};
-
-use super::hypervisor::{GeniezoneError, KvmError};
-use uuid::Uuid;
-
-/// Result type with hypervisor error.
-pub type Result<T> = result::Result<T, Error>;
-
-/// Hypervisor error.
-#[derive(Debug, Clone)]
-pub enum Error {
-    /// MMIO guard is not supported.
-    MmioGuardNotSupported,
-    /// Failed to invoke a certain KVM HVC function.
-    KvmError(KvmError, u32),
-    /// Failed to invoke GenieZone HVC function.
-    GeniezoneError(GeniezoneError, u32),
-    /// Unsupported Hypervisor
-    UnsupportedHypervisorUuid(Uuid),
-}
-
-impl fmt::Display for Error {
-    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match self {
-            Self::MmioGuardNotSupported => write!(f, "MMIO guard is not supported"),
-            Self::KvmError(e, function_id) => {
-                write!(f, "Failed to invoke the HVC function with function ID {function_id}: {e}")
-            }
-            Self::GeniezoneError(e, function_id) => {
-                write!(
-                    f,
-                    "Failed to invoke GenieZone HVC function with function ID {function_id}: {e}"
-                )
-            }
-            Self::UnsupportedHypervisorUuid(u) => {
-                write!(f, "Unsupported Hypervisor UUID {u}")
-            }
-        }
-    }
-}
diff --git a/libs/libvmbase/src/hyp/hypervisor.rs b/libs/libvmbase/src/hyp/hypervisor.rs
deleted file mode 100644
index 1b45f38..0000000
--- a/libs/libvmbase/src/hyp/hypervisor.rs
+++ /dev/null
@@ -1,127 +0,0 @@
-// 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.
-
-//! Wrappers around hypervisor back-ends.
-
-mod common;
-mod geniezone;
-mod gunyah;
-mod kvm;
-
-use super::{Error, Result};
-use alloc::boxed::Box;
-use common::Hypervisor;
-pub use common::{DeviceAssigningHypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
-pub use geniezone::GeniezoneError;
-use geniezone::GeniezoneHypervisor;
-use gunyah::GunyahHypervisor;
-pub use kvm::KvmError;
-use kvm::{ProtectedKvmHypervisor, RegularKvmHypervisor};
-use once_cell::race::OnceBox;
-use smccc::hvc64;
-use uuid::Uuid;
-
-enum HypervisorBackend {
-    RegularKvm,
-    Gunyah,
-    Geniezone,
-    ProtectedKvm,
-}
-
-impl HypervisorBackend {
-    fn get_hypervisor(&self) -> &'static dyn Hypervisor {
-        match self {
-            Self::RegularKvm => &RegularKvmHypervisor,
-            Self::Gunyah => &GunyahHypervisor,
-            Self::Geniezone => &GeniezoneHypervisor,
-            Self::ProtectedKvm => &ProtectedKvmHypervisor,
-        }
-    }
-}
-
-impl TryFrom<Uuid> for HypervisorBackend {
-    type Error = Error;
-
-    fn try_from(uuid: Uuid) -> Result<HypervisorBackend> {
-        match uuid {
-            GeniezoneHypervisor::UUID => Ok(HypervisorBackend::Geniezone),
-            GunyahHypervisor::UUID => Ok(HypervisorBackend::Gunyah),
-            RegularKvmHypervisor::UUID => {
-                // Protected KVM has the same UUID as "regular" KVM so issue an HVC that is assumed
-                // to only be supported by pKVM: if it returns SUCCESS, deduce that this is pKVM
-                // and if it returns NOT_SUPPORTED assume that it is "regular" KVM.
-                match ProtectedKvmHypervisor.as_mmio_guard().unwrap().granule() {
-                    Ok(_) => Ok(HypervisorBackend::ProtectedKvm),
-                    Err(Error::KvmError(KvmError::NotSupported, _)) => {
-                        Ok(HypervisorBackend::RegularKvm)
-                    }
-                    Err(e) => Err(e),
-                }
-            }
-            u => Err(Error::UnsupportedHypervisorUuid(u)),
-        }
-    }
-}
-
-const ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID: u32 = 0x8600ff01;
-
-fn query_vendor_hyp_call_uid() -> Uuid {
-    let args = [0u64; 17];
-    let res = hvc64(ARM_SMCCC_VENDOR_HYP_CALL_UID_FUNC_ID, args);
-
-    // KVM's UUID of "28b46fb6-2ec5-11e9-a9ca-4b564d003a74" is generated by
-    // Uuid::from_u128() from an input value of
-    // 0x28b46fb6_2ec511e9_a9ca4b56_4d003a74. ARM's SMC calling convention
-    // (Document number ARM DEN 0028E) describes the UUID register mapping such
-    // that W0 contains bytes 0..3 of UUID, with byte 0 in lower order bits. In
-    // the KVM example, byte 0 of KVM's UUID (0x28) will be returned in the low
-    // 8-bits of W0, while byte 15 (0x74) will be returned in bits 31-24 of W3.
-    //
-    // `uuid` value derived below thus need to be byte-reversed before
-    // being used in Uuid::from_u128(). Alternately use Uuid::from_u128_le()
-    // to achieve the same.
-
-    let uuid = ((res[3] as u32 as u128) << 96)
-        | ((res[2] as u32 as u128) << 64)
-        | ((res[1] as u32 as u128) << 32)
-        | (res[0] as u32 as u128);
-
-    Uuid::from_u128_le(uuid)
-}
-
-fn detect_hypervisor() -> HypervisorBackend {
-    query_vendor_hyp_call_uid().try_into().expect("Failed to detect hypervisor")
-}
-
-/// Gets the hypervisor singleton.
-fn get_hypervisor() -> &'static dyn Hypervisor {
-    static HYPERVISOR: OnceBox<HypervisorBackend> = OnceBox::new();
-
-    HYPERVISOR.get_or_init(|| Box::new(detect_hypervisor())).get_hypervisor()
-}
-
-/// Gets the MMIO_GUARD hypervisor singleton, if any.
-pub fn get_mmio_guard() -> Option<&'static dyn MmioGuardedHypervisor> {
-    get_hypervisor().as_mmio_guard()
-}
-
-/// Gets the dynamic memory sharing hypervisor singleton, if any.
-pub fn get_mem_sharer() -> Option<&'static dyn MemSharingHypervisor> {
-    get_hypervisor().as_mem_sharer()
-}
-
-/// Gets the device assigning hypervisor singleton, if any.
-pub fn get_device_assigner() -> Option<&'static dyn DeviceAssigningHypervisor> {
-    get_hypervisor().as_device_assigner()
-}
diff --git a/libs/libvmbase/src/hyp/hypervisor/common.rs b/libs/libvmbase/src/hyp/hypervisor/common.rs
deleted file mode 100644
index 8f0e4dc..0000000
--- a/libs/libvmbase/src/hyp/hypervisor/common.rs
+++ /dev/null
@@ -1,76 +0,0 @@
-// 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.
-
-//! This module regroups some common traits shared by all the hypervisors.
-
-use crate::hyp::Result;
-
-/// Trait for the hypervisor.
-pub trait Hypervisor {
-    /// Returns the hypervisor's MMIO_GUARD implementation, if any.
-    fn as_mmio_guard(&self) -> Option<&dyn MmioGuardedHypervisor> {
-        None
-    }
-
-    /// Returns the hypervisor's dynamic memory sharing implementation, if any.
-    fn as_mem_sharer(&self) -> Option<&dyn MemSharingHypervisor> {
-        None
-    }
-
-    /// Returns the hypervisor's device assigning implementation, if any.
-    fn as_device_assigner(&self) -> Option<&dyn DeviceAssigningHypervisor> {
-        None
-    }
-}
-
-pub trait MmioGuardedHypervisor {
-    /// Enrolls with the MMIO guard so that all MMIO will be blocked unless allow-listed with
-    /// `MmioGuardedHypervisor::map`.
-    fn enroll(&self) -> Result<()>;
-
-    /// Maps a page containing the given memory address to the hypervisor MMIO guard.
-    /// The page size corresponds to the MMIO guard granule size.
-    fn map(&self, addr: usize) -> Result<()>;
-
-    /// Unmaps a page containing the given memory address from the hypervisor MMIO guard.
-    /// The page size corresponds to the MMIO guard granule size.
-    fn unmap(&self, addr: usize) -> Result<()>;
-
-    /// Returns the MMIO guard granule size in bytes.
-    fn granule(&self) -> Result<usize>;
-}
-
-pub trait MemSharingHypervisor {
-    /// Shares a region of memory with host, granting it read, write and execute permissions.
-    /// The size of the region is equal to the memory protection granule returned by
-    /// [`hyp_meminfo`].
-    fn share(&self, base_ipa: u64) -> Result<()>;
-
-    /// Revokes access permission from host to a memory region previously shared with
-    /// [`mem_share`]. The size of the region is equal to the memory protection granule returned by
-    /// [`hyp_meminfo`].
-    fn unshare(&self, base_ipa: u64) -> Result<()>;
-
-    /// Returns the memory protection granule size in bytes.
-    fn granule(&self) -> Result<usize>;
-}
-
-/// Device assigning hypervisor
-pub trait DeviceAssigningHypervisor {
-    /// Returns MMIO token.
-    fn get_phys_mmio_token(&self, base_ipa: u64) -> Result<u64>;
-
-    /// Returns DMA token as a tuple of (phys_iommu_id, phys_sid).
-    fn get_phys_iommu_token(&self, pviommu_id: u64, vsid: u64) -> Result<(u64, u64)>;
-}
diff --git a/libs/libvmbase/src/hyp/hypervisor/geniezone.rs b/libs/libvmbase/src/hyp/hypervisor/geniezone.rs
deleted file mode 100644
index fcb9b42..0000000
--- a/libs/libvmbase/src/hyp/hypervisor/geniezone.rs
+++ /dev/null
@@ -1,161 +0,0 @@
-// 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.
-
-//! Wrappers around calls to the GenieZone hypervisor.
-
-use core::fmt::{self, Display, Formatter};
-
-use super::{Hypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
-use crate::{
-    hyp::{Error, Result},
-    memory::page_4kb_of,
-};
-
-use smccc::{
-    error::{positive_or_error_64, success_or_error_64},
-    hvc64,
-};
-use uuid::{uuid, Uuid};
-
-pub(super) struct GeniezoneHypervisor;
-
-const ARM_SMCCC_GZVM_FUNC_HYP_MEMINFO: u32 = 0xc6000002;
-const ARM_SMCCC_GZVM_FUNC_MEM_SHARE: u32 = 0xc6000003;
-const ARM_SMCCC_GZVM_FUNC_MEM_UNSHARE: u32 = 0xc6000004;
-
-const VENDOR_HYP_GZVM_MMIO_GUARD_INFO_FUNC_ID: u32 = 0xc6000005;
-const VENDOR_HYP_GZVM_MMIO_GUARD_ENROLL_FUNC_ID: u32 = 0xc6000006;
-const VENDOR_HYP_GZVM_MMIO_GUARD_MAP_FUNC_ID: u32 = 0xc6000007;
-const VENDOR_HYP_GZVM_MMIO_GUARD_UNMAP_FUNC_ID: u32 = 0xc6000008;
-
-impl GeniezoneHypervisor {
-    // We generate this uuid by ourselves to identify GenieZone hypervisor
-    // and share the same identification along with guest VMs.
-    // The previous uuid was removed due to duplication elsewhere.
-    pub const UUID: Uuid = uuid!("7e134ed0-3b82-488d-8cee-69c19211dbe7");
-}
-
-/// Error from a GenieZone HVC call.
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-pub enum GeniezoneError {
-    /// The call is not supported by the implementation.
-    NotSupported,
-    /// The call is not required to implement.
-    NotRequired,
-    /// One of the call parameters has a invalid value.
-    InvalidParameter,
-    /// There was an unexpected return value.
-    Unknown(i64),
-}
-
-impl From<i64> for GeniezoneError {
-    fn from(value: i64) -> Self {
-        match value {
-            -1 => GeniezoneError::NotSupported,
-            -2 => GeniezoneError::NotRequired,
-            -3 => GeniezoneError::InvalidParameter,
-            _ => GeniezoneError::Unknown(value),
-        }
-    }
-}
-
-impl From<i32> for GeniezoneError {
-    fn from(value: i32) -> Self {
-        i64::from(value).into()
-    }
-}
-
-impl Display for GeniezoneError {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        match self {
-            Self::NotSupported => write!(f, "GenieZone call not supported"),
-            Self::NotRequired => write!(f, "GenieZone call not required"),
-            Self::InvalidParameter => write!(f, "GenieZone call received invalid value"),
-            Self::Unknown(e) => write!(f, "Unknown return value from GenieZone {} ({0:#x})", e),
-        }
-    }
-}
-
-impl Hypervisor for GeniezoneHypervisor {
-    fn as_mmio_guard(&self) -> Option<&dyn MmioGuardedHypervisor> {
-        Some(self)
-    }
-
-    fn as_mem_sharer(&self) -> Option<&dyn MemSharingHypervisor> {
-        Some(self)
-    }
-}
-
-impl MmioGuardedHypervisor for GeniezoneHypervisor {
-    fn enroll(&self) -> Result<()> {
-        let args = [0u64; 17];
-        match success_or_error_64(hvc64(VENDOR_HYP_GZVM_MMIO_GUARD_ENROLL_FUNC_ID, args)[0]) {
-            Ok(()) => Ok(()),
-            Err(GeniezoneError::NotSupported) | Err(GeniezoneError::NotRequired) => {
-                Err(Error::MmioGuardNotSupported)
-            }
-            Err(e) => Err(Error::GeniezoneError(e, VENDOR_HYP_GZVM_MMIO_GUARD_ENROLL_FUNC_ID)),
-        }
-    }
-
-    fn map(&self, addr: usize) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = page_4kb_of(addr).try_into().unwrap();
-
-        checked_hvc64_expect_zero(VENDOR_HYP_GZVM_MMIO_GUARD_MAP_FUNC_ID, args)
-    }
-
-    fn unmap(&self, addr: usize) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = page_4kb_of(addr).try_into().unwrap();
-
-        checked_hvc64_expect_zero(VENDOR_HYP_GZVM_MMIO_GUARD_UNMAP_FUNC_ID, args)
-    }
-
-    fn granule(&self) -> Result<usize> {
-        let args = [0u64; 17];
-        let granule = checked_hvc64(VENDOR_HYP_GZVM_MMIO_GUARD_INFO_FUNC_ID, args)?;
-        Ok(granule.try_into().unwrap())
-    }
-}
-
-impl MemSharingHypervisor for GeniezoneHypervisor {
-    fn share(&self, base_ipa: u64) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = base_ipa;
-
-        checked_hvc64_expect_zero(ARM_SMCCC_GZVM_FUNC_MEM_SHARE, args)
-    }
-
-    fn unshare(&self, base_ipa: u64) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = base_ipa;
-
-        checked_hvc64_expect_zero(ARM_SMCCC_GZVM_FUNC_MEM_UNSHARE, args)
-    }
-
-    fn granule(&self) -> Result<usize> {
-        let args = [0u64; 17];
-        let granule = checked_hvc64(ARM_SMCCC_GZVM_FUNC_HYP_MEMINFO, args)?;
-        Ok(granule.try_into().unwrap())
-    }
-}
-
-fn checked_hvc64_expect_zero(function: u32, args: [u64; 17]) -> Result<()> {
-    success_or_error_64(hvc64(function, args)[0]).map_err(|e| Error::GeniezoneError(e, function))
-}
-
-fn checked_hvc64(function: u32, args: [u64; 17]) -> Result<u64> {
-    positive_or_error_64(hvc64(function, args)[0]).map_err(|e| Error::GeniezoneError(e, function))
-}
diff --git a/libs/libvmbase/src/hyp/hypervisor/gunyah.rs b/libs/libvmbase/src/hyp/hypervisor/gunyah.rs
deleted file mode 100644
index 45c01bf..0000000
--- a/libs/libvmbase/src/hyp/hypervisor/gunyah.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-use super::common::Hypervisor;
-use uuid::{uuid, Uuid};
-
-pub(super) struct GunyahHypervisor;
-
-impl GunyahHypervisor {
-    pub const UUID: Uuid = uuid!("c1d58fcd-a453-5fdb-9265-ce36673d5f14");
-}
-
-impl Hypervisor for GunyahHypervisor {}
diff --git a/libs/libvmbase/src/hyp/hypervisor/kvm.rs b/libs/libvmbase/src/hyp/hypervisor/kvm.rs
deleted file mode 100644
index 7ed829e..0000000
--- a/libs/libvmbase/src/hyp/hypervisor/kvm.rs
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright 2022, 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.
-
-//! Wrappers around calls to the KVM hypervisor.
-
-use core::fmt::{self, Display, Formatter};
-
-use super::{DeviceAssigningHypervisor, Hypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
-use crate::{
-    hyp::{Error, Result},
-    memory::page_4kb_of,
-};
-
-use smccc::{
-    error::{positive_or_error_64, success_or_error_32, success_or_error_64},
-    hvc64,
-};
-use uuid::{uuid, Uuid};
-
-/// Error from a KVM HVC call.
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
-pub enum KvmError {
-    /// The call is not supported by the implementation.
-    NotSupported,
-    /// One of the call parameters has a non-supported value.
-    InvalidParameter,
-    /// There was an unexpected return value.
-    Unknown(i64),
-}
-
-impl From<i64> for KvmError {
-    fn from(value: i64) -> Self {
-        match value {
-            -1 => KvmError::NotSupported,
-            -3 => KvmError::InvalidParameter,
-            _ => KvmError::Unknown(value),
-        }
-    }
-}
-
-impl From<i32> for KvmError {
-    fn from(value: i32) -> Self {
-        i64::from(value).into()
-    }
-}
-
-impl Display for KvmError {
-    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
-        match self {
-            Self::NotSupported => write!(f, "KVM call not supported"),
-            Self::InvalidParameter => write!(f, "KVM call received non-supported value"),
-            Self::Unknown(e) => write!(f, "Unknown return value from KVM {} ({0:#x})", e),
-        }
-    }
-}
-
-const ARM_SMCCC_KVM_FUNC_HYP_MEMINFO: u32 = 0xc6000002;
-const ARM_SMCCC_KVM_FUNC_MEM_SHARE: u32 = 0xc6000003;
-const ARM_SMCCC_KVM_FUNC_MEM_UNSHARE: u32 = 0xc6000004;
-
-const VENDOR_HYP_KVM_MMIO_GUARD_INFO_FUNC_ID: u32 = 0xc6000005;
-const VENDOR_HYP_KVM_MMIO_GUARD_ENROLL_FUNC_ID: u32 = 0xc6000006;
-const VENDOR_HYP_KVM_MMIO_GUARD_MAP_FUNC_ID: u32 = 0xc6000007;
-const VENDOR_HYP_KVM_MMIO_GUARD_UNMAP_FUNC_ID: u32 = 0xc6000008;
-
-const VENDOR_HYP_KVM_DEV_REQ_MMIO_FUNC_ID: u32 = 0xc6000012;
-const VENDOR_HYP_KVM_DEV_REQ_DMA_FUNC_ID: u32 = 0xc600001b;
-
-pub(super) struct RegularKvmHypervisor;
-
-impl RegularKvmHypervisor {
-    // Based on ARM_SMCCC_VENDOR_HYP_UID_KVM_REG values listed in Linux kernel source:
-    // https://github.com/torvalds/linux/blob/master/include/linux/arm-smccc.h
-    pub(super) const UUID: Uuid = uuid!("28b46fb6-2ec5-11e9-a9ca-4b564d003a74");
-}
-
-impl Hypervisor for RegularKvmHypervisor {}
-
-pub(super) struct ProtectedKvmHypervisor;
-
-impl Hypervisor for ProtectedKvmHypervisor {
-    fn as_mmio_guard(&self) -> Option<&dyn MmioGuardedHypervisor> {
-        Some(self)
-    }
-
-    fn as_mem_sharer(&self) -> Option<&dyn MemSharingHypervisor> {
-        Some(self)
-    }
-
-    fn as_device_assigner(&self) -> Option<&dyn DeviceAssigningHypervisor> {
-        Some(self)
-    }
-}
-
-impl MmioGuardedHypervisor for ProtectedKvmHypervisor {
-    fn enroll(&self) -> Result<()> {
-        let args = [0u64; 17];
-        match success_or_error_64(hvc64(VENDOR_HYP_KVM_MMIO_GUARD_ENROLL_FUNC_ID, args)[0]) {
-            Ok(()) => Ok(()),
-            Err(KvmError::NotSupported) => Err(Error::MmioGuardNotSupported),
-            Err(e) => Err(Error::KvmError(e, VENDOR_HYP_KVM_MMIO_GUARD_ENROLL_FUNC_ID)),
-        }
-    }
-
-    fn map(&self, addr: usize) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = page_4kb_of(addr).try_into().unwrap();
-
-        if cfg!(feature = "compat_android_13") {
-            let res = hvc64(VENDOR_HYP_KVM_MMIO_GUARD_MAP_FUNC_ID, args)[0];
-            // pKVM returns i32 instead of the intended i64 in Android 13.
-            return success_or_error_32(res as u32)
-                .map_err(|e| Error::KvmError(e, VENDOR_HYP_KVM_MMIO_GUARD_MAP_FUNC_ID));
-        }
-
-        checked_hvc64_expect_zero(VENDOR_HYP_KVM_MMIO_GUARD_MAP_FUNC_ID, args)
-    }
-
-    fn unmap(&self, addr: usize) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = page_4kb_of(addr).try_into().unwrap();
-
-        if cfg!(feature = "compat_android_13") {
-            let res = hvc64(VENDOR_HYP_KVM_MMIO_GUARD_UNMAP_FUNC_ID, args)[0];
-            // pKVM returns NOT_SUPPORTED for SUCCESS in Android 13.
-            return match success_or_error_64(res) {
-                Err(KvmError::NotSupported) | Ok(_) => Ok(()),
-                Err(e) => Err(Error::KvmError(e, VENDOR_HYP_KVM_MMIO_GUARD_UNMAP_FUNC_ID)),
-            };
-        }
-
-        checked_hvc64_expect_zero(VENDOR_HYP_KVM_MMIO_GUARD_UNMAP_FUNC_ID, args)
-    }
-
-    fn granule(&self) -> Result<usize> {
-        let args = [0u64; 17];
-        let granule = checked_hvc64(VENDOR_HYP_KVM_MMIO_GUARD_INFO_FUNC_ID, args)?;
-        Ok(granule.try_into().unwrap())
-    }
-}
-
-impl MemSharingHypervisor for ProtectedKvmHypervisor {
-    fn share(&self, base_ipa: u64) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = base_ipa;
-
-        checked_hvc64_expect_zero(ARM_SMCCC_KVM_FUNC_MEM_SHARE, args)
-    }
-
-    fn unshare(&self, base_ipa: u64) -> Result<()> {
-        let mut args = [0u64; 17];
-        args[0] = base_ipa;
-
-        checked_hvc64_expect_zero(ARM_SMCCC_KVM_FUNC_MEM_UNSHARE, args)
-    }
-
-    fn granule(&self) -> Result<usize> {
-        let args = [0u64; 17];
-        let granule = checked_hvc64(ARM_SMCCC_KVM_FUNC_HYP_MEMINFO, args)?;
-        Ok(granule.try_into().unwrap())
-    }
-}
-
-impl DeviceAssigningHypervisor for ProtectedKvmHypervisor {
-    fn get_phys_mmio_token(&self, base_ipa: u64) -> Result<u64> {
-        let mut args = [0u64; 17];
-        args[0] = base_ipa;
-
-        let ret = checked_hvc64_expect_results(VENDOR_HYP_KVM_DEV_REQ_MMIO_FUNC_ID, args)?;
-        Ok(ret[0])
-    }
-
-    fn get_phys_iommu_token(&self, pviommu_id: u64, vsid: u64) -> Result<(u64, u64)> {
-        let mut args = [0u64; 17];
-        args[0] = pviommu_id;
-        args[1] = vsid;
-
-        let ret = checked_hvc64_expect_results(VENDOR_HYP_KVM_DEV_REQ_DMA_FUNC_ID, args)?;
-        Ok((ret[0], ret[1]))
-    }
-}
-
-fn checked_hvc64_expect_zero(function: u32, args: [u64; 17]) -> Result<()> {
-    success_or_error_64(hvc64(function, args)[0]).map_err(|e| Error::KvmError(e, function))
-}
-
-fn checked_hvc64(function: u32, args: [u64; 17]) -> Result<u64> {
-    positive_or_error_64(hvc64(function, args)[0]).map_err(|e| Error::KvmError(e, function))
-}
-
-fn checked_hvc64_expect_results(function: u32, args: [u64; 17]) -> Result<[u64; 17]> {
-    let [ret, results @ ..] = hvc64(function, args);
-    success_or_error_64(ret).map_err(|e| Error::KvmError(e, function))?;
-    Ok(results)
-}
diff --git a/libs/libvmbase/src/lib.rs b/libs/libvmbase/src/lib.rs
index 630834b..431e899 100644
--- a/libs/libvmbase/src/lib.rs
+++ b/libs/libvmbase/src/lib.rs
@@ -26,7 +26,6 @@
 pub mod fdt;
 pub mod heap;
 mod hvc;
-pub mod hyp;
 pub mod layout;
 pub mod linker;
 pub mod logger;
diff --git a/libs/libvmbase/src/memory/error.rs b/libs/libvmbase/src/memory/error.rs
index 4d08f1e..870e4c9 100644
--- a/libs/libvmbase/src/memory/error.rs
+++ b/libs/libvmbase/src/memory/error.rs
@@ -16,7 +16,7 @@
 
 use core::fmt;
 
-use crate::hyp;
+use hypervisor_backends::Error as HypervisorError;
 
 /// Errors for MemoryTracker operations.
 #[derive(Debug, Clone)]
@@ -38,7 +38,7 @@
     /// Region couldn't be unmapped.
     FailedToUnmap,
     /// Error from the interaction with the hypervisor.
-    Hypervisor(hyp::Error),
+    Hypervisor(HypervisorError),
     /// Failure to set `SHARED_MEMORY`.
     SharedMemorySetFailure,
     /// Failure to set `SHARED_POOL`.
@@ -82,8 +82,8 @@
     }
 }
 
-impl From<hyp::Error> for MemoryTrackerError {
-    fn from(e: hyp::Error) -> Self {
+impl From<HypervisorError> for MemoryTrackerError {
+    fn from(e: HypervisorError) -> Self {
         Self::Hypervisor(e)
     }
 }
diff --git a/libs/libvmbase/src/memory/shared.rs b/libs/libvmbase/src/memory/shared.rs
index 92dd09e..7e5e7e9 100644
--- a/libs/libvmbase/src/memory/shared.rs
+++ b/libs/libvmbase/src/memory/shared.rs
@@ -16,7 +16,6 @@
 
 use super::error::MemoryTrackerError;
 use super::util::virt_to_phys;
-use crate::hyp::{self, get_mem_sharer, get_mmio_guard};
 use crate::layout;
 use crate::util::unchecked_align_down;
 use aarch64_paging::paging::{MemoryRegion as VaRange, VirtualAddress, PAGE_SIZE};
@@ -29,6 +28,7 @@
 use core::ops::Range;
 use core::ptr::NonNull;
 use core::result;
+use hypervisor_backends::{self, get_mem_sharer, get_mmio_guard};
 use log::trace;
 use once_cell::race::OnceBox;
 use spin::mutex::SpinMutex;
@@ -108,7 +108,7 @@
 
 /// Allocates a memory range of at least the given size and alignment that is shared with the host.
 /// Returns a pointer to the buffer.
-pub(crate) fn alloc_shared(layout: Layout) -> hyp::Result<NonNull<u8>> {
+pub(crate) fn alloc_shared(layout: Layout) -> hypervisor_backends::Result<NonNull<u8>> {
     assert_ne!(layout.size(), 0);
     let Some(buffer) = try_shared_alloc(layout) else {
         handle_alloc_error(layout);
@@ -143,7 +143,10 @@
 ///
 /// The memory must have been allocated by `alloc_shared` with the same layout, and not yet
 /// deallocated.
-pub(crate) unsafe fn dealloc_shared(vaddr: NonNull<u8>, layout: Layout) -> hyp::Result<()> {
+pub(crate) unsafe fn dealloc_shared(
+    vaddr: NonNull<u8>,
+    layout: Layout,
+) -> hypervisor_backends::Result<()> {
     SHARED_POOL.get().unwrap().lock().dealloc_aligned(vaddr.as_ptr() as usize, layout);
 
     trace!("Deallocated shared buffer at {vaddr:?} with {layout:?}");
diff --git a/libs/libvmbase/src/memory/tracker.rs b/libs/libvmbase/src/memory/tracker.rs
index acf182f..c1f5d54 100644
--- a/libs/libvmbase/src/memory/tracker.rs
+++ b/libs/libvmbase/src/memory/tracker.rs
@@ -19,7 +19,6 @@
 use super::page_table::{PageTable, MMIO_LAZY_MAP_FLAG};
 use super::shared::{SHARED_MEMORY, SHARED_POOL};
 use crate::dsb;
-use crate::hyp::get_mmio_guard;
 use crate::memory::shared::{MemoryRange, MemorySharer, MmioSharer};
 use crate::util::RangeExt as _;
 use aarch64_paging::paging::{Attributes, Descriptor, MemoryRegion as VaRange, VirtualAddress};
@@ -29,6 +28,7 @@
 use core::num::NonZeroUsize;
 use core::ops::Range;
 use core::result;
+use hypervisor_backends::get_mmio_guard;
 use log::{debug, error};
 use spin::mutex::SpinMutex;
 use tinyvec::ArrayVec;
