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 /acpi_tables/src/sdt.rs | |
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 'acpi_tables/src/sdt.rs')
-rw-r--r-- | acpi_tables/src/sdt.rs | 21 |
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()); |