diff options
author | Tristan Muntsinger <muntsinger@google.com> | 2018-12-21 16:01:56 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-01-28 14:17:10 -0800 |
commit | 4133b0120d1e16cafbb373b2ae17a214b594038b (patch) | |
tree | 177506988846e4b86e639cdb963bbaba0c4e6ca9 /src | |
parent | f052cfefc8d6d27fa068c34190615db1819b8fef (diff) | |
download | crosvm-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.rs | 11 | ||||
-rw-r--r-- | src/main.rs | 21 |
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", |