Use thiserror in pVM firmware.
Test: m pvmfw
Change-Id: Ib98435fadff21754166b9187941a3e2d265082e6
diff --git a/libs/libhypervisor_backends/Android.bp b/libs/libhypervisor_backends/Android.bp
index b001b8f..27e3fe5 100644
--- a/libs/libhypervisor_backends/Android.bp
+++ b/libs/libhypervisor_backends/Android.bp
@@ -14,6 +14,7 @@
rustlibs: [
"libonce_cell_nostd",
"libsmccc",
+ "libthiserror_nostd",
"libuuid_nostd",
],
enabled: false,
diff --git a/libs/libhypervisor_backends/rules.mk b/libs/libhypervisor_backends/rules.mk
index 6fc9dea..1a48773 100644
--- a/libs/libhypervisor_backends/rules.mk
+++ b/libs/libhypervisor_backends/rules.mk
@@ -8,6 +8,7 @@
trusty/user/base/lib/liballoc-rust \
$(call FIND_CRATE,once_cell) \
$(call FIND_CRATE,smccc) \
+ $(call FIND_CRATE,thiserror) \
$(call FIND_CRATE,uuid) \
include make/library.mk
\ No newline at end of file
diff --git a/libs/libhypervisor_backends/src/hypervisor/geniezone.rs b/libs/libhypervisor_backends/src/hypervisor/geniezone.rs
index fe56528..76e010b 100644
--- a/libs/libhypervisor_backends/src/hypervisor/geniezone.rs
+++ b/libs/libhypervisor_backends/src/hypervisor/geniezone.rs
@@ -14,8 +14,6 @@
//! Wrappers around calls to the GenieZone hypervisor.
-use core::fmt::{self, Display, Formatter};
-
use super::{Hypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
use crate::{mem::page_4kb_of, Error, Result};
@@ -23,6 +21,7 @@
error::{positive_or_error_64, success_or_error_64},
hvc64,
};
+use thiserror::Error;
use uuid::{uuid, Uuid};
pub(super) struct GeniezoneHypervisor;
@@ -44,15 +43,19 @@
}
/// Error from a GenieZone HVC call.
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Eq, Error, PartialEq)]
pub enum GeniezoneError {
/// The call is not supported by the implementation.
+ #[error("GenieZone call not supported")]
NotSupported,
/// The call is not required to implement.
+ #[error("GenieZone call not required")]
NotRequired,
/// One of the call parameters has a invalid value.
+ #[error("GenieZone call received invalid value")]
InvalidParameter,
/// There was an unexpected return value.
+ #[error("Unknown return value from GenieZone {0} ({0:#x})")]
Unknown(i64),
}
@@ -73,17 +76,6 @@
}
}
-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)
diff --git a/libs/libhypervisor_backends/src/hypervisor/kvm.rs b/libs/libhypervisor_backends/src/hypervisor/kvm.rs
index e18c1f4..233097b 100644
--- a/libs/libhypervisor_backends/src/hypervisor/kvm.rs
+++ b/libs/libhypervisor_backends/src/hypervisor/kvm.rs
@@ -14,8 +14,6 @@
//! Wrappers around calls to the KVM hypervisor.
-use core::fmt::{self, Display, Formatter};
-
use super::{DeviceAssigningHypervisor, Hypervisor, MemSharingHypervisor, MmioGuardedHypervisor};
use crate::{mem::page_4kb_of, Error, Result};
@@ -23,16 +21,20 @@
error::{positive_or_error_64, success_or_error_32, success_or_error_64},
hvc64,
};
+use thiserror::Error;
use uuid::{uuid, Uuid};
/// Error from a KVM HVC call.
-#[derive(Copy, Clone, Debug, Eq, PartialEq)]
+#[derive(Copy, Clone, Debug, Eq, Error, PartialEq)]
pub enum KvmError {
/// The call is not supported by the implementation.
+ #[error("KVM call not supported")]
NotSupported,
/// One of the call parameters has a non-supported value.
+ #[error("KVM call received non-supported value")]
InvalidParameter,
/// There was an unexpected return value.
+ #[error("Unknown return value from KVM {0} ({0:#x})")]
Unknown(i64),
}
@@ -52,16 +54,6 @@
}
}
-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;
diff --git a/libs/libvmbase/Android.bp b/libs/libvmbase/Android.bp
index 3088633..d10642a 100644
--- a/libs/libvmbase/Android.bp
+++ b/libs/libvmbase/Android.bp
@@ -88,6 +88,7 @@
"libsmccc",
"libspin_nostd",
"libstatic_assertions",
+ "libthiserror_nostd",
"libtinyvec_nostd",
"libuuid_nostd",
"libvirtio_drivers",
diff --git a/libs/libvmbase/src/fdt/pci.rs b/libs/libvmbase/src/fdt/pci.rs
index ebaa671..44ad455 100644
--- a/libs/libvmbase/src/fdt/pci.rs
+++ b/libs/libvmbase/src/fdt/pci.rs
@@ -14,40 +14,47 @@
//! Library for working with (VirtIO) PCI devices discovered from a device tree.
-use core::{
- ffi::CStr,
- fmt::{self, Display, Formatter},
- ops::Range,
-};
+use core::{ffi::CStr, ops::Range};
use libfdt::{AddressRange, Fdt, FdtError, FdtNode};
use log::debug;
+use thiserror::Error;
use virtio_drivers::transport::pci::bus::{Cam, PciRoot};
/// PCI MMIO configuration region size.
const PCI_CFG_SIZE: usize = 0x100_0000;
/// An error parsing a PCI node from an FDT.
-#[derive(Clone, Debug, Eq, PartialEq)]
+#[derive(Clone, Debug, Eq, Error, PartialEq)]
pub enum PciError {
/// Error getting PCI node from FDT.
+ #[error("Error getting PCI node from FDT: {0}")]
FdtErrorPci(FdtError),
/// Failed to find PCI bus in FDT.
+ #[error("Failed to find PCI bus in FDT.")]
FdtNoPci,
/// Error getting `reg` property from PCI node.
+ #[error("Error getting reg property from PCI node: {0}")]
FdtErrorReg(FdtError),
/// PCI node missing `reg` property.
+ #[error("PCI node missing reg property.")]
FdtMissingReg,
/// Empty `reg property on PCI node.
+ #[error("Empty reg property on PCI node.")]
FdtRegEmpty,
/// PCI `reg` property missing size.
+ #[error("PCI reg property missing size.")]
FdtRegMissingSize,
/// PCI CAM size reported by FDT is not what we expected.
+ #[error("FDT says PCI CAM is {0} bytes but we expected {PCI_CFG_SIZE}.")]
CamWrongSize(usize),
/// Error getting `ranges` property from PCI node.
+ #[error("Error getting ranges property from PCI node: {0}")]
FdtErrorRanges(FdtError),
/// PCI node missing `ranges` property.
+ #[error("PCI node missing ranges property.")]
FdtMissingRanges,
/// Bus address is not equal to CPU physical address in `ranges` property.
+ #[error("bus address {bus_address:#018x} != CPU physical address {cpu_physical:#018x}")]
RangeAddressMismatch {
/// A bus address from the `ranges` property.
bus_address: u64,
@@ -55,39 +62,10 @@
cpu_physical: u64,
},
/// No suitable PCI memory range found.
+ #[error("No suitable PCI memory range found.")]
NoSuitableRange,
}
-impl Display for PciError {
- fn fmt(&self, f: &mut Formatter) -> fmt::Result {
- match self {
- Self::FdtErrorPci(e) => write!(f, "Error getting PCI node from FDT: {}", e),
- Self::FdtNoPci => write!(f, "Failed to find PCI bus in FDT."),
- Self::FdtErrorReg(e) => write!(f, "Error getting reg property from PCI node: {}", e),
- Self::FdtMissingReg => write!(f, "PCI node missing reg property."),
- Self::FdtRegEmpty => write!(f, "Empty reg property on PCI node."),
- Self::FdtRegMissingSize => write!(f, "PCI reg property missing size."),
- Self::CamWrongSize(cam_size) => write!(
- f,
- "FDT says PCI CAM is {} bytes but we expected {}.",
- cam_size, PCI_CFG_SIZE
- ),
- Self::FdtErrorRanges(e) => {
- write!(f, "Error getting ranges property from PCI node: {}", e)
- }
- Self::FdtMissingRanges => write!(f, "PCI node missing ranges property."),
- Self::RangeAddressMismatch { bus_address, cpu_physical } => {
- write!(
- f,
- "bus address {:#018x} != CPU physical address {:#018x}",
- bus_address, cpu_physical
- )
- }
- Self::NoSuitableRange => write!(f, "No suitable PCI memory range found."),
- }
- }
-}
-
/// Information about the PCI bus parsed from the device tree.
#[derive(Clone, Debug)]
pub struct PciInfo {