| // Copyright 2019 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. |
| |
| //! The root level module that includes the config and aggregate of the submodules for running said |
| //! configs. |
| |
| pub mod argument; |
| pub mod linux; |
| #[cfg(feature = "plugin")] |
| pub mod plugin; |
| |
| use std::collections::BTreeMap; |
| use std::net; |
| use std::os::unix::io::RawFd; |
| use std::path::PathBuf; |
| use std::str::FromStr; |
| |
| use arch::Pstore; |
| use devices::virtio::fs::passthrough; |
| #[cfg(feature = "gpu")] |
| use devices::virtio::gpu::GpuParameters; |
| use devices::SerialParameters; |
| use libc::{getegid, geteuid}; |
| |
| static SECCOMP_POLICY_DIR: &str = "/usr/share/policy/crosvm"; |
| |
| /// Indicates the location and kind of executable kernel for a VM. |
| #[derive(Debug)] |
| pub enum Executable { |
| /// An executable intended to be run as a BIOS directly. |
| Bios(PathBuf), |
| /// A elf linux kernel, loaded and executed by crosvm. |
| Kernel(PathBuf), |
| /// Path to a plugin executable that is forked by crosvm. |
| Plugin(PathBuf), |
| } |
| |
| pub struct DiskOption { |
| pub path: PathBuf, |
| pub read_only: bool, |
| pub sparse: bool, |
| pub block_size: u32, |
| } |
| |
| /// A bind mount for directories in the plugin process. |
| pub struct BindMount { |
| pub src: PathBuf, |
| pub dst: PathBuf, |
| pub writable: bool, |
| } |
| |
| /// A mapping of linux group IDs for the plugin process. |
| pub struct GidMap { |
| pub inner: libc::gid_t, |
| pub outer: libc::gid_t, |
| pub count: u32, |
| } |
| |
| const DEFAULT_TOUCH_DEVICE_WIDTH: u32 = 800; |
| const DEFAULT_TOUCH_DEVICE_HEIGHT: u32 = 1280; |
| |
| pub struct TouchDeviceOption { |
| pub path: PathBuf, |
| pub width: u32, |
| pub height: u32, |
| } |
| |
| impl TouchDeviceOption { |
| pub fn new(path: PathBuf) -> TouchDeviceOption { |
| TouchDeviceOption { |
| path, |
| width: DEFAULT_TOUCH_DEVICE_WIDTH, |
| height: DEFAULT_TOUCH_DEVICE_HEIGHT, |
| } |
| } |
| } |
| |
| pub enum SharedDirKind { |
| FS, |
| P9, |
| } |
| |
| impl FromStr for SharedDirKind { |
| type Err = &'static str; |
| |
| fn from_str(s: &str) -> Result<Self, Self::Err> { |
| use SharedDirKind::*; |
| match s { |
| "fs" | "FS" => Ok(FS), |
| "9p" | "9P" | "p9" | "P9" => Ok(P9), |
| _ => Err("invalid file system type"), |
| } |
| } |
| } |
| |
| impl Default for SharedDirKind { |
| fn default() -> SharedDirKind { |
| SharedDirKind::P9 |
| } |
| } |
| |
| pub struct SharedDir { |
| pub src: PathBuf, |
| pub tag: String, |
| pub kind: SharedDirKind, |
| pub uid_map: String, |
| pub gid_map: String, |
| pub cfg: passthrough::Config, |
| } |
| |
| impl Default for SharedDir { |
| fn default() -> SharedDir { |
| SharedDir { |
| src: Default::default(), |
| tag: Default::default(), |
| kind: Default::default(), |
| uid_map: format!("0 {} 1", unsafe { geteuid() }), |
| gid_map: format!("0 {} 1", unsafe { getegid() }), |
| cfg: Default::default(), |
| } |
| } |
| } |
| |
| /// Aggregate of all configurable options for a running VM. |
| pub struct Config { |
| pub vcpu_count: Option<u32>, |
| pub vcpu_affinity: Vec<usize>, |
| pub memory: Option<u64>, |
| pub executable_path: Option<Executable>, |
| pub android_fstab: Option<PathBuf>, |
| pub initrd_path: Option<PathBuf>, |
| pub params: Vec<String>, |
| pub socket_path: Option<PathBuf>, |
| pub plugin_root: Option<PathBuf>, |
| pub plugin_mounts: Vec<BindMount>, |
| pub plugin_gid_maps: Vec<GidMap>, |
| pub disks: Vec<DiskOption>, |
| pub pmem_devices: Vec<DiskOption>, |
| pub pstore: Option<Pstore>, |
| pub host_ip: Option<net::Ipv4Addr>, |
| pub netmask: Option<net::Ipv4Addr>, |
| pub mac_address: Option<net_util::MacAddress>, |
| pub vhost_net: bool, |
| pub tap_fd: Vec<RawFd>, |
| pub cid: Option<u64>, |
| pub wayland_socket_paths: BTreeMap<String, PathBuf>, |
| pub wayland_dmabuf: bool, |
| pub x_display: Option<String>, |
| pub shared_dirs: Vec<SharedDir>, |
| pub sandbox: bool, |
| pub seccomp_policy_dir: PathBuf, |
| pub seccomp_log_failures: bool, |
| #[cfg(feature = "gpu")] |
| pub gpu_parameters: Option<GpuParameters>, |
| pub software_tpm: bool, |
| pub cras_audio: bool, |
| pub cras_capture: bool, |
| pub null_audio: bool, |
| pub display_window_keyboard: bool, |
| pub display_window_mouse: bool, |
| pub serial_parameters: BTreeMap<u8, SerialParameters>, |
| pub syslog_tag: Option<String>, |
| pub virtio_single_touch: Option<TouchDeviceOption>, |
| pub virtio_trackpad: Option<TouchDeviceOption>, |
| pub virtio_mouse: Option<PathBuf>, |
| pub virtio_keyboard: Option<PathBuf>, |
| pub virtio_input_evdevs: Vec<PathBuf>, |
| pub split_irqchip: bool, |
| pub vfio: Option<PathBuf>, |
| } |
| |
| impl Default for Config { |
| fn default() -> Config { |
| Config { |
| vcpu_count: None, |
| vcpu_affinity: Vec::new(), |
| memory: None, |
| executable_path: None, |
| android_fstab: None, |
| initrd_path: None, |
| params: Vec::new(), |
| socket_path: None, |
| plugin_root: None, |
| plugin_mounts: Vec::new(), |
| plugin_gid_maps: Vec::new(), |
| disks: Vec::new(), |
| pmem_devices: Vec::new(), |
| pstore: None, |
| host_ip: None, |
| netmask: None, |
| mac_address: None, |
| vhost_net: false, |
| tap_fd: Vec::new(), |
| cid: None, |
| #[cfg(feature = "gpu")] |
| gpu_parameters: None, |
| software_tpm: false, |
| wayland_socket_paths: BTreeMap::new(), |
| wayland_dmabuf: false, |
| x_display: None, |
| display_window_keyboard: false, |
| display_window_mouse: false, |
| shared_dirs: Vec::new(), |
| sandbox: !cfg!(feature = "default-no-sandbox"), |
| seccomp_policy_dir: PathBuf::from(SECCOMP_POLICY_DIR), |
| seccomp_log_failures: false, |
| cras_audio: false, |
| cras_capture: false, |
| null_audio: false, |
| serial_parameters: BTreeMap::new(), |
| syslog_tag: None, |
| virtio_single_touch: None, |
| virtio_trackpad: None, |
| virtio_mouse: None, |
| virtio_keyboard: None, |
| virtio_input_evdevs: Vec::new(), |
| split_irqchip: false, |
| vfio: None, |
| } |
| } |
| } |