summary refs log tree commit diff
path: root/acpi_tables/src/sdt.rs
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 /acpi_tables/src/sdt.rs
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 'acpi_tables/src/sdt.rs')
-rw-r--r--acpi_tables/src/sdt.rs21
1 files changed, 21 insertions, 0 deletions
diff --git a/acpi_tables/src/sdt.rs b/acpi_tables/src/sdt.rs
index 0ea61a0..96f4d0f 100644
--- a/acpi_tables/src/sdt.rs
+++ b/acpi_tables/src/sdt.rs
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+use std::fs::File;
+use std::io::{ErrorKind, Read, Result};
+use std::path::PathBuf;
+
 use data_model::DataInit;
 
 /// SDT represents for System Description Table. The structure SDT is a
@@ -54,6 +58,23 @@ impl SDT {
         sdt
     }
 
+    /// Set up the ACPI table from file content. Verify file checksum.
+    pub fn from_file(path: &PathBuf) -> Result<Self> {
+        let mut file = File::open(path)?;
+        let mut data = Vec::new();
+        file.read_to_end(&mut data)?;
+        let checksum = super::generate_checksum(data.as_slice());
+        if checksum == 0 {
+            Ok(SDT { data })
+        } else {
+            Err(ErrorKind::InvalidData.into())
+        }
+    }
+
+    pub fn is_signature(&self, signature: &[u8; 4]) -> bool {
+        self.data[0..4] == *signature
+    }
+
     fn update_checksum(&mut self) {
         self.data[CHECKSUM_OFFSET] = 0;
         let checksum = super::generate_checksum(self.data.as_slice());