diff --git a/src/main.rs b/src/main.rs index 7299bf0c6..793b57216 100755 --- a/src/main.rs +++ b/src/main.rs @@ -120,5 +120,7 @@ fn main() { ) .unwrap(); - vmm::boot_kernel(vm_config).unwrap(); + if let Err(e) = vmm::boot_kernel(vm_config) { + println!("Guest boot failed: {}", e); + } } diff --git a/vmm/src/lib.rs b/vmm/src/lib.rs index ee03a2488..5fa3e9660 100644 --- a/vmm/src/lib.rs +++ b/vmm/src/lib.rs @@ -6,10 +6,38 @@ extern crate kvm_ioctls; use kvm_ioctls::*; +use std::fmt::{self, Display}; +use std::result; pub mod vm; -use self::vm::{Result, Vm, VmConfig}; +use self::vm::{Vm, VmConfig}; + +/// Errors associated with VM management +#[derive(Debug)] +pub enum Error { + /// Cannot create a new VM. + VmNew(vm::Error), + + /// Cannot start a VM. + VmStart(vm::Error), + + /// Cannot load a kernel. + LoadKernel(vm::Error), +} +pub type Result = result::Result; + +impl Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use self::Error::*; + + match self { + VmNew(e) => write!(f, "Can not create a new virtual machine: {:?}", e), + VmStart(e) => write!(f, "Can not start a new virtual machine: {:?}", e), + LoadKernel(e) => write!(f, "Can not load a guest kernel: {:?}", e), + } + } +} struct Vmm { kvm: Kvm, @@ -24,10 +52,10 @@ impl Vmm { pub fn boot_kernel(config: VmConfig) -> Result<()> { let vmm = Vmm::new()?; - let mut vm = Vm::new(&vmm.kvm, config)?; + let mut vm = Vm::new(&vmm.kvm, config).map_err(Error::VmNew)?; - let entry = vm.load_kernel()?; - vm.start(entry)?; + let entry = vm.load_kernel().map_err(Error::LoadKernel)?; + vm.start(entry).map_err(Error::VmStart)?; Ok(()) }