diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/src/lib.rs | 9 | ||||
-rw-r--r-- | arch/src/pstore.rs | 74 |
2 files changed, 83 insertions, 0 deletions
diff --git a/arch/src/lib.rs b/arch/src/lib.rs index ca9cd66..16cd6fa 100644 --- a/arch/src/lib.rs +++ b/arch/src/lib.rs @@ -4,6 +4,7 @@ pub mod android; pub mod fdt; +pub mod pstore; use std::collections::BTreeMap; use std::error::Error as StdError; @@ -11,6 +12,7 @@ use std::fmt::{self, Display}; use std::fs::File; use std::io::{self, Read, Seek, SeekFrom}; use std::os::unix::io::AsRawFd; +use std::path::PathBuf; use std::sync::Arc; use devices::virtio::VirtioDevice; @@ -29,6 +31,12 @@ pub enum VmImage { Bios(File), } +#[derive(Clone)] +pub struct Pstore { + pub path: PathBuf, + pub size: u32, +} + /// Holds the pieces needed to build a VM. Passed to `build_vm` in the `LinuxArch` trait below to /// create a `RunnableLinuxVm`. pub struct VmComponents { @@ -37,6 +45,7 @@ pub struct VmComponents { pub vcpu_affinity: Vec<usize>, pub vm_image: VmImage, pub android_fstab: Option<File>, + pub pstore: Option<Pstore>, pub initrd_image: Option<File>, pub extra_kernel_params: Vec<String>, pub wayland_dmabuf: bool, diff --git a/arch/src/pstore.rs b/arch/src/pstore.rs new file mode 100644 index 0000000..a06ea1b --- /dev/null +++ b/arch/src/pstore.rs @@ -0,0 +1,74 @@ +// Copyright 2020 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +use std::fmt::{self, Display}; +use std::fs::OpenOptions; +use std::io; + +use crate::Pstore; +use kvm::Vm; +use resources::SystemAllocator; +use resources::{Alloc, MmioType}; +use sys_util::{GuestAddress, MemoryMapping}; + +/// Error for pstore. +#[derive(Debug)] +pub enum Error { + IoError(io::Error), + MmapError(sys_util::MmapError), + ResourcesError(resources::Error), + SysUtilError(sys_util::Error), +} + +impl Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use self::Error::*; + + match self { + IoError(e) => write!(f, "failed to create pstore backend file: {}", e), + MmapError(e) => write!(f, "failed to get file mapped address: {}", e), + ResourcesError(e) => write!(f, "failed to allocate pstore region: {}", e), + SysUtilError(e) => write!(f, "file to add pstore region to mmio: {}", e), + } + } +} + +impl std::error::Error for Error {} +type Result<T> = std::result::Result<T, Error>; + +pub struct RamoopsRegion { + pub address: u64, + pub size: u32, +} + +/// Creates a mmio memory region for pstore. +pub fn create_memory_region( + vm: &mut Vm, + resources: &mut SystemAllocator, + pstore: &Pstore, +) -> Result<RamoopsRegion> { + let file = OpenOptions::new() + .read(true) + .write(true) + .create(true) + .open(&pstore.path) + .map_err(Error::IoError)?; + file.set_len(pstore.size as u64).map_err(Error::IoError)?; + + let address = resources + .mmio_allocator(MmioType::High) + .allocate(pstore.size as u64, Alloc::Pstore, "pstore".to_owned()) + .map_err(Error::ResourcesError)?; + + let memory_mapping = + MemoryMapping::from_fd(&file, pstore.size as usize).map_err(Error::MmapError)?; + + vm.add_mmio_memory(GuestAddress(address), memory_mapping, false, false) + .map_err(Error::SysUtilError)?; + + Ok(RamoopsRegion { + address, + size: pstore.size, + }) +} |