mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2026-08-05 02:19:16 +00:00
build: Move to rust-vmm acpi_tables crate
This code is indentical to what is in this repository. When a release gets made we can then switch to that. Fixes: #5122 Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -5,6 +5,7 @@ version = 3
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "acpi_tables"
|
name = "acpi_tables"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
source = "git+https://github.com/rust-vmm/acpi_tables?branch=main#4fd38dd5f746730ec5ae848dafcf8c2f50a13fc3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"vm-memory",
|
"vm-memory",
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -73,7 +73,6 @@ tracing = ["vmm/tracing", "tracer/tracing"]
|
|||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
"acpi_tables",
|
|
||||||
"api_client",
|
"api_client",
|
||||||
"arch",
|
"arch",
|
||||||
"block_util",
|
"block_util",
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "acpi_tables"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = ["The Cloud Hypervisor Authors"]
|
|
||||||
edition = "2021"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
vm-memory = "0.10.0"
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,12 +0,0 @@
|
|||||||
// Copyright © 2019 Intel Corporation
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
//
|
|
||||||
|
|
||||||
pub mod aml;
|
|
||||||
pub mod rsdp;
|
|
||||||
pub mod sdt;
|
|
||||||
|
|
||||||
fn generate_checksum(data: &[u8]) -> u8 {
|
|
||||||
(255 - data.iter().fold(0u8, |acc, x| acc.wrapping_add(*x))).wrapping_add(1)
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
// Copyright © 2019 Intel Corporation
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
//
|
|
||||||
|
|
||||||
use vm_memory::ByteValued;
|
|
||||||
|
|
||||||
#[repr(packed)]
|
|
||||||
#[derive(Clone, Copy, Default)]
|
|
||||||
pub struct Rsdp {
|
|
||||||
pub signature: [u8; 8],
|
|
||||||
pub checksum: u8,
|
|
||||||
pub oem_id: [u8; 6],
|
|
||||||
pub revision: u8,
|
|
||||||
_rsdt_addr: u32,
|
|
||||||
pub length: u32,
|
|
||||||
pub xsdt_addr: u64,
|
|
||||||
pub extended_checksum: u8,
|
|
||||||
_reserved: [u8; 3],
|
|
||||||
}
|
|
||||||
|
|
||||||
// SAFETY: Rsdp only contains a series of integers
|
|
||||||
unsafe impl ByteValued for Rsdp {}
|
|
||||||
|
|
||||||
impl Rsdp {
|
|
||||||
pub fn new(oem_id: [u8; 6], xsdt_addr: u64) -> Self {
|
|
||||||
let mut rsdp = Rsdp {
|
|
||||||
signature: *b"RSD PTR ",
|
|
||||||
checksum: 0,
|
|
||||||
oem_id,
|
|
||||||
revision: 2,
|
|
||||||
_rsdt_addr: 0,
|
|
||||||
length: std::mem::size_of::<Rsdp>() as u32,
|
|
||||||
xsdt_addr,
|
|
||||||
extended_checksum: 0,
|
|
||||||
_reserved: [0; 3],
|
|
||||||
};
|
|
||||||
|
|
||||||
rsdp.checksum = super::generate_checksum(&rsdp.as_slice()[0..19]);
|
|
||||||
rsdp.extended_checksum = super::generate_checksum(rsdp.as_slice());
|
|
||||||
rsdp
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn len() -> usize {
|
|
||||||
std::mem::size_of::<Rsdp>()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::Rsdp;
|
|
||||||
use vm_memory::bytes::ByteValued;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_rsdp() {
|
|
||||||
let rsdp = Rsdp::new(*b"CHYPER", 0xdead_beef);
|
|
||||||
let sum = rsdp
|
|
||||||
.as_slice()
|
|
||||||
.iter()
|
|
||||||
.fold(0u8, |acc, x| acc.wrapping_add(*x));
|
|
||||||
assert_eq!(sum, 0);
|
|
||||||
let sum: u8 = rsdp
|
|
||||||
.as_slice()
|
|
||||||
.iter()
|
|
||||||
.fold(0u8, |acc, x| acc.wrapping_add(*x));
|
|
||||||
assert_eq!(sum, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
// Copyright © 2019 Intel Corporation
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
//
|
|
||||||
|
|
||||||
#[repr(packed)]
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
pub struct GenericAddress {
|
|
||||||
pub address_space_id: u8,
|
|
||||||
pub register_bit_width: u8,
|
|
||||||
pub register_bit_offset: u8,
|
|
||||||
pub access_size: u8,
|
|
||||||
pub address: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl GenericAddress {
|
|
||||||
pub fn io_port_address<T>(address: u16) -> Self {
|
|
||||||
GenericAddress {
|
|
||||||
address_space_id: 1,
|
|
||||||
register_bit_width: 8 * std::mem::size_of::<T>() as u8,
|
|
||||||
register_bit_offset: 0,
|
|
||||||
access_size: std::mem::size_of::<T>() as u8,
|
|
||||||
address: u64::from(address),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pub fn mmio_address<T>(address: u64) -> Self {
|
|
||||||
GenericAddress {
|
|
||||||
address_space_id: 0,
|
|
||||||
register_bit_width: 8 * std::mem::size_of::<T>() as u8,
|
|
||||||
register_bit_offset: 0,
|
|
||||||
access_size: std::mem::size_of::<T>() as u8,
|
|
||||||
address,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Sdt {
|
|
||||||
data: Vec<u8>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Sdt {
|
|
||||||
pub fn new(
|
|
||||||
signature: [u8; 4],
|
|
||||||
length: u32,
|
|
||||||
revision: u8,
|
|
||||||
oem_id: [u8; 6],
|
|
||||||
oem_table: [u8; 8],
|
|
||||||
oem_revision: u32,
|
|
||||||
) -> Self {
|
|
||||||
assert!(length >= 36);
|
|
||||||
|
|
||||||
let mut data = Vec::with_capacity(length as usize);
|
|
||||||
data.extend_from_slice(&signature);
|
|
||||||
data.extend_from_slice(&length.to_le_bytes());
|
|
||||||
data.push(revision);
|
|
||||||
data.push(0); // checksum
|
|
||||||
data.extend_from_slice(&oem_id);
|
|
||||||
data.extend_from_slice(&oem_table);
|
|
||||||
data.extend_from_slice(&oem_revision.to_le_bytes());
|
|
||||||
data.extend_from_slice(b"CLDH");
|
|
||||||
data.extend_from_slice(&0u32.to_le_bytes());
|
|
||||||
assert_eq!(data.len(), 36);
|
|
||||||
|
|
||||||
data.resize(length as usize, 0);
|
|
||||||
let mut sdt = Sdt { data };
|
|
||||||
|
|
||||||
sdt.update_checksum();
|
|
||||||
sdt
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn update_checksum(&mut self) {
|
|
||||||
self.data[9] = 0;
|
|
||||||
let checksum = super::generate_checksum(self.data.as_slice());
|
|
||||||
self.data[9] = checksum
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn as_slice(&self) -> &[u8] {
|
|
||||||
self.data.as_slice()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn append<T>(&mut self, value: T) {
|
|
||||||
let orig_length = self.data.len();
|
|
||||||
let new_length = orig_length + std::mem::size_of::<T>();
|
|
||||||
self.data.resize(new_length, 0);
|
|
||||||
self.write_u32(4, new_length as u32);
|
|
||||||
self.write(orig_length, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn append_slice(&mut self, data: &[u8]) {
|
|
||||||
let orig_length = self.data.len();
|
|
||||||
let new_length = orig_length + data.len();
|
|
||||||
self.write_u32(4, new_length as u32);
|
|
||||||
self.data.extend_from_slice(data);
|
|
||||||
self.update_checksum();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Write a value at the given offset
|
|
||||||
pub fn write<T>(&mut self, offset: usize, value: T) {
|
|
||||||
assert!((offset + (std::mem::size_of::<T>() - 1)) < self.data.len());
|
|
||||||
// SAFETY: The assertion above makes sure we don't do out of bounds write.
|
|
||||||
unsafe {
|
|
||||||
*(((self.data.as_mut_ptr() as usize) + offset) as *mut T) = value;
|
|
||||||
}
|
|
||||||
self.update_checksum();
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn write_u8(&mut self, offset: usize, val: u8) {
|
|
||||||
self.write(offset, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn write_u16(&mut self, offset: usize, val: u16) {
|
|
||||||
self.write(offset, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn write_u32(&mut self, offset: usize, val: u32) {
|
|
||||||
self.write(offset, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn write_u64(&mut self, offset: usize, val: u64) {
|
|
||||||
self.write(offset, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn len(&self) -> usize {
|
|
||||||
self.data.len()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn is_empty(&self) -> bool {
|
|
||||||
self.data.is_empty()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use super::Sdt;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sdt() {
|
|
||||||
let mut sdt = Sdt::new(*b"TEST", 40, 1, *b"CLOUDH", *b"TESTTEST", 1);
|
|
||||||
let sum: u8 = sdt
|
|
||||||
.as_slice()
|
|
||||||
.iter()
|
|
||||||
.fold(0u8, |acc, x| acc.wrapping_add(*x));
|
|
||||||
assert_eq!(sum, 0);
|
|
||||||
sdt.write_u32(36, 0x12345678);
|
|
||||||
let sum: u8 = sdt
|
|
||||||
.as_slice()
|
|
||||||
.iter()
|
|
||||||
.fold(0u8, |acc, x| acc.wrapping_add(*x));
|
|
||||||
assert_eq!(sum, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@ authors = ["The Chromium OS Authors"]
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
acpi_tables = { path = "../acpi_tables" }
|
acpi_tables = { git = "https://github.com/rust-vmm/acpi_tables", branch = "main" }
|
||||||
anyhow = "1.0.69"
|
anyhow = "1.0.69"
|
||||||
arch = { path = "../arch" }
|
arch = { path = "../arch" }
|
||||||
bitflags = "1.3.2"
|
bitflags = "1.3.2"
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ tdx = ["arch/tdx", "hypervisor/tdx"]
|
|||||||
tracing = ["tracer/tracing"]
|
tracing = ["tracer/tracing"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
acpi_tables = { path = "../acpi_tables" }
|
acpi_tables = { git = "https://github.com/rust-vmm/acpi_tables", branch = "main" }
|
||||||
anyhow = "1.0.69"
|
anyhow = "1.0.69"
|
||||||
arc-swap = "1.5.1"
|
arc-swap = "1.5.1"
|
||||||
arch = { path = "../arch" }
|
arch = { path = "../arch" }
|
||||||
|
|||||||
Reference in New Issue
Block a user