From d33407aa99fb798d6c3c9e5f4132f76354334c19 Mon Sep 17 00:00:00 2001 From: Sonny Rao Date: Thu, 22 Feb 2018 17:48:00 -0800 Subject: guest_memory: implement error trait This implements the error trait so we can get more useful error information back on failures. BUG=chromium:797868 TEST=./build_test passes on all architectures TEST=crosvm runs on caroline Change-Id: Ia131b1eb14d24709c10f2ba752a962e822134a42 Reviewed-on: https://chromium-review.googlesource.com/938312 Commit-Ready: Sonny Rao Tested-by: Sonny Rao Reviewed-by: Sonny Rao --- sys_util/src/guest_memory.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'sys_util/src/guest_memory.rs') diff --git a/sys_util/src/guest_memory.rs b/sys_util/src/guest_memory.rs index f9dc716..23c8a2f 100644 --- a/sys_util/src/guest_memory.rs +++ b/sys_util/src/guest_memory.rs @@ -7,6 +7,8 @@ use std::io::{Read, Write}; use std::result; use std::sync::Arc; +use std::error::{self, Error as GuestMemoryError}; +use std::fmt::{self, Display}; use data_model::DataInit; use data_model::volatile_memory::*; @@ -19,10 +21,30 @@ pub enum Error { MemoryAccess(GuestAddress, mmap::Error), MemoryMappingFailed(mmap::Error), MemoryRegionOverlap, - RegionOperationFailed, } pub type Result = result::Result; +impl error::Error for Error { + fn description(&self) -> &str { + match self { + &Error::InvalidGuestAddress(_) => + "Invalid Guest Address", + &Error::MemoryAccess(_, _) => + "Invalid Guest Memory Access", + &Error::MemoryMappingFailed(_) => + "Failed to map guest memory", + &Error::MemoryRegionOverlap => + "Memory regions overlap", + } + } +} + +impl Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "Guest memory error: {}", Error::description(self)) + } +} + struct MemoryRegion { mapping: MemoryMapping, guest_base: GuestAddress, -- cgit 1.4.1