summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTristan Muntsinger <muntsinger@google.com>2018-12-21 16:01:56 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-01-28 14:17:10 -0800
commit4133b0120d1e16cafbb373b2ae17a214b594038b (patch)
tree177506988846e4b86e639cdb963bbaba0c4e6ca9 /src
parentf052cfefc8d6d27fa068c34190615db1819b8fef (diff)
downloadcrosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.tar
crosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.tar.gz
crosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.tar.bz2
crosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.tar.lz
crosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.tar.xz
crosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.tar.zst
crosvm-4133b0120d1e16cafbb373b2ae17a214b594038b.zip
crosvm: x86_64 guest support for android device-tree
This device tree is derived from the Android fstab file which is
provided via command line flag.

BUG=chromium:922737
TEST=None
CQ-DEPEND=CL:1415390
CQ-DEPEND=CL:1415270

Change-Id: Idd007c844f84cab3ff37be16a718f14e5f630312
Reviewed-on: https://chromium-review.googlesource.com/1370058
Commit-Ready: Daniel Verkamp <dverkamp@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/linux.rs11
-rw-r--r--src/main.rs21
2 files changed, 32 insertions, 0 deletions
diff --git a/src/linux.rs b/src/linux.rs
index a61392b..fb327ec 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -68,6 +68,7 @@ pub enum Error {
     InvalidWaylandPath,
     NetDeviceNew(devices::virtio::NetError),
     NoVarEmpty,
+    OpenAndroidFstab(PathBuf, io::Error),
     OpenKernel(PathBuf, io::Error),
     P9DeviceNew(devices::virtio::P9Error),
     PollContextAdd(sys_util::Error),
@@ -124,6 +125,9 @@ impl fmt::Display for Error {
             Error::NetDeviceNew(e) => write!(f, "failed to set up virtio networking: {:?}", e),
             Error::NoVarEmpty => write!(f, "/var/empty doesn't exist, can't jail devices."),
             Error::OpenKernel(p, e) => write!(f, "failed to open kernel image {:?}: {}", p, e),
+            Error::OpenAndroidFstab(ref p, ref e) => {
+                write!(f, "failed to open android fstab file {:?}: {}", p, e)
+            }
             Error::P9DeviceNew(e) => write!(f, "failed to create 9p device: {}", e),
             Error::PollContextAdd(e) => write!(f, "failed to add fd to poll context: {:?}", e),
             Error::PollContextDelete(e) => {
@@ -851,6 +855,13 @@ pub fn run_config(cfg: Config) -> Result<()> {
         vcpu_count: cfg.vcpu_count.unwrap_or(1),
         kernel_image: File::open(cfg.kernel_path.as_path())
             .map_err(|e| Error::OpenKernel(cfg.kernel_path.clone(), e))?,
+        android_fstab: cfg
+            .android_fstab
+            .as_ref()
+            .map(|x| {
+                File::open(x.as_path()).map_err(|e| Error::OpenAndroidFstab(x.to_path_buf(), e))
+            })
+            .map_or(Ok(None), |v| v.map(Some))?,
         extra_kernel_params: cfg.params.clone(),
         wayland_dmabuf: cfg.wayland_dmabuf,
     };
diff --git a/src/main.rs b/src/main.rs
index 5847087..9392360 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -76,6 +76,7 @@ pub struct Config {
     vcpu_count: Option<u32>,
     memory: Option<usize>,
     kernel_path: PathBuf,
+    android_fstab: Option<PathBuf>,
     params: Vec<String>,
     socket_path: Option<PathBuf>,
     plugin: Option<PathBuf>,
@@ -104,6 +105,7 @@ impl Default for Config {
             vcpu_count: None,
             memory: None,
             kernel_path: PathBuf::default(),
+            android_fstab: None,
             params: Vec::new(),
             socket_path: None,
             plugin: None,
@@ -178,6 +180,24 @@ fn set_argument(cfg: &mut Config, name: &str, value: Option<&str>) -> argument::
                 cfg.kernel_path = kernel_path;
             }
         }
+        "android-fstab" => {
+            if cfg.android_fstab.is_some()
+                && !cfg.android_fstab.as_ref().unwrap().as_os_str().is_empty()
+            {
+                return Err(argument::Error::TooManyArguments(
+                    "expected exactly one android fstab path".to_owned(),
+                ));
+            } else {
+                let android_fstab = PathBuf::from(value.unwrap());
+                if !android_fstab.exists() {
+                    return Err(argument::Error::InvalidValue {
+                        value: value.unwrap().to_owned(),
+                        expected: "this android fstab path does not exist",
+                    });
+                }
+                cfg.android_fstab = Some(android_fstab);
+            }
+        }
         "params" => {
             cfg.params.push(value.unwrap().to_owned());
         }
@@ -481,6 +501,7 @@ fn set_argument(cfg: &mut Config, name: &str, value: Option<&str>) -> argument::
 fn run_vm(args: std::env::Args) -> std::result::Result<(), ()> {
     let arguments =
         &[Argument::positional("KERNEL", "bzImage of kernel to run"),
+          Argument::value("android-fstab", "PATH", "Path to Android fstab"),
           Argument::short_value('p',
                                 "params",
                                 "PARAMS",