diff options
author | Tomasz Jeznach <tjeznach@chromium.org> | 2020-05-20 23:27:59 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-01 23:25:39 +0000 |
commit | 4264464153a7a788ef73c5015ac8bbde5f8ebe1c (patch) | |
tree | 38d1e2b38304f9fc81b9627a037fa11146a291fb /src | |
parent | 2705264dc649a60077dfefc9924b8689d8f7d994 (diff) | |
download | crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.tar crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.tar.gz crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.tar.bz2 crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.tar.lz crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.tar.xz crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.tar.zst crosvm-4264464153a7a788ef73c5015ac8bbde5f8ebe1c.zip |
acpi: support user provided ACPI SDTs.
Enable support for user provided ACPI tables with supplementary system description. Argument --acpi-table shall point to exsting file or pseudo-file with valid ACPI table content. BUG=None TEST=boot Linux kernel with generated SSDT tables. Change-Id: I8eac21da070dcc325884ed888cc7bcb01bc086ce Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2212501 Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Tested-by: Tomasz Jeznach <tjeznach@chromium.org> Commit-Queue: Tomasz Jeznach <tjeznach@chromium.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/crosvm.rs | 2 | ||||
-rw-r--r-- | src/linux.rs | 9 | ||||
-rw-r--r-- | src/main.rs | 18 |
3 files changed, 29 insertions, 0 deletions
diff --git a/src/crosvm.rs b/src/crosvm.rs index 33ed236..1ea7e0d 100644 --- a/src/crosvm.rs +++ b/src/crosvm.rs @@ -204,6 +204,7 @@ pub struct Config { pub vfio: Vec<PathBuf>, pub video_dec: bool, pub video_enc: bool, + pub acpi_tables: Vec<PathBuf>, } impl Default for Config { @@ -254,6 +255,7 @@ impl Default for Config { vfio: Vec::new(), video_dec: false, video_enc: false, + acpi_tables: Vec::new(), } } } diff --git a/src/linux.rs b/src/linux.rs index e95f372..fb463c2 100644 --- a/src/linux.rs +++ b/src/linux.rs @@ -26,6 +26,8 @@ use std::time::Duration; use libc::{self, c_int, gid_t, uid_t}; +use acpi_tables::sdt::SDT; + #[cfg(feature = "gpu")] use devices::virtio::EventDevice; use devices::virtio::{self, Console, VirtioDevice}; @@ -109,6 +111,7 @@ pub enum Error { LoadKernel(Box<dyn StdError>), MemoryTooLarge, NetDeviceNew(virtio::NetError), + OpenAcpiTable(PathBuf, io::Error), OpenAndroidFstab(PathBuf, io::Error), OpenBios(PathBuf, io::Error), OpenInitrd(PathBuf, io::Error), @@ -196,6 +199,7 @@ impl Display for Error { LoadKernel(e) => write!(f, "failed to load kernel: {}", e), MemoryTooLarge => write!(f, "requested memory size too large"), NetDeviceNew(e) => write!(f, "failed to set up virtio networking: {}", e), + OpenAcpiTable(p, e) => write!(f, "failed to open ACPI file {}: {}", p.display(), e), OpenAndroidFstab(p, e) => write!( f, "failed to open android fstab file {}: {}", @@ -1712,6 +1716,11 @@ pub fn run_config(cfg: Config) -> Result<()> { initrd_image, extra_kernel_params: cfg.params.clone(), wayland_dmabuf: cfg.wayland_dmabuf, + acpi_sdts: cfg + .acpi_tables + .iter() + .map(|path| SDT::from_file(path).map_err(|e| Error::OpenAcpiTable(path.clone(), e))) + .collect::<Result<Vec<SDT>>>()?, }; let control_server_socket = match &cfg.socket_path { diff --git a/src/main.rs b/src/main.rs index 61fcd48..e8a6e6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1232,6 +1232,23 @@ fn set_argument(cfg: &mut Config, name: &str, value: Option<&str>) -> argument:: "video-encoder" => { cfg.video_enc = true; } + "acpi-table" => { + let acpi_table = PathBuf::from(value.unwrap()); + if !acpi_table.exists() { + return Err(argument::Error::InvalidValue { + value: value.unwrap().to_owned(), + expected: String::from("the acpi-table path does not exist"), + }); + } + if !acpi_table.is_file() { + return Err(argument::Error::InvalidValue { + value: value.unwrap().to_owned(), + expected: String::from("the acpi-table path should be a file"), + }); + } + + cfg.acpi_tables.push(acpi_table); + } "help" => return Err(argument::Error::PrintHelp), _ => unreachable!(), @@ -1406,6 +1423,7 @@ writeback=BOOL - Indicates whether the VM can use writeback caching (default: fa Argument::flag("video-decoder", "(EXPERIMENTAL) enable virtio-video decoder device"), #[cfg(feature = "video-encoder")] Argument::flag("video-encoder", "(EXPERIMENTAL) enable virtio-video encoder device"), + Argument::value("acpi-table", "PATH", "Path to user provided ACPI table"), Argument::short_flag('h', "help", "Print help message.")]; let mut cfg = Config::default(); |