summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTomasz Jeznach <tjeznach@chromium.org>2020-05-20 23:27:59 -0700
committerCommit Bot <commit-bot@chromium.org>2020-06-01 23:25:39 +0000
commit4264464153a7a788ef73c5015ac8bbde5f8ebe1c (patch)
tree38d1e2b38304f9fc81b9627a037fa11146a291fb /src
parent2705264dc649a60077dfefc9924b8689d8f7d994 (diff)
downloadcrosvm-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.rs2
-rw-r--r--src/linux.rs9
-rw-r--r--src/main.rs18
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();