xref: /aosp_15_r20/external/crosvm/acpi_tables/src/rsdp.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2020 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::AsBytes;
6*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::FromBytes;
7*bb4ee6a4SAndroid Build Coastguard Worker use zerocopy::FromZeroes;
8*bb4ee6a4SAndroid Build Coastguard Worker 
9*bb4ee6a4SAndroid Build Coastguard Worker #[repr(C, packed)]
10*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Clone, Copy, Default, FromZeroes, FromBytes, AsBytes)]
11*bb4ee6a4SAndroid Build Coastguard Worker pub struct RSDP {
12*bb4ee6a4SAndroid Build Coastguard Worker     pub signature: [u8; 8],
13*bb4ee6a4SAndroid Build Coastguard Worker     pub checksum: u8,
14*bb4ee6a4SAndroid Build Coastguard Worker     pub oem_id: [u8; 6],
15*bb4ee6a4SAndroid Build Coastguard Worker     pub revision: u8,
16*bb4ee6a4SAndroid Build Coastguard Worker     _rsdt_addr: u32,
17*bb4ee6a4SAndroid Build Coastguard Worker     pub length: u32,
18*bb4ee6a4SAndroid Build Coastguard Worker     pub xsdt_addr: u64,
19*bb4ee6a4SAndroid Build Coastguard Worker     pub extended_checksum: u8,
20*bb4ee6a4SAndroid Build Coastguard Worker     _reserved: [u8; 3],
21*bb4ee6a4SAndroid Build Coastguard Worker }
22*bb4ee6a4SAndroid Build Coastguard Worker 
23*bb4ee6a4SAndroid Build Coastguard Worker impl RSDP {
new(oem_id: [u8; 6], xsdt_addr: u64) -> Self24*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(oem_id: [u8; 6], xsdt_addr: u64) -> Self {
25*bb4ee6a4SAndroid Build Coastguard Worker         let mut rsdp = RSDP {
26*bb4ee6a4SAndroid Build Coastguard Worker             signature: *b"RSD PTR ",
27*bb4ee6a4SAndroid Build Coastguard Worker             checksum: 0,
28*bb4ee6a4SAndroid Build Coastguard Worker             oem_id,
29*bb4ee6a4SAndroid Build Coastguard Worker             revision: 2,
30*bb4ee6a4SAndroid Build Coastguard Worker             _rsdt_addr: 0,
31*bb4ee6a4SAndroid Build Coastguard Worker             length: std::mem::size_of::<RSDP>() as u32,
32*bb4ee6a4SAndroid Build Coastguard Worker             xsdt_addr,
33*bb4ee6a4SAndroid Build Coastguard Worker             extended_checksum: 0,
34*bb4ee6a4SAndroid Build Coastguard Worker             _reserved: [0; 3],
35*bb4ee6a4SAndroid Build Coastguard Worker         };
36*bb4ee6a4SAndroid Build Coastguard Worker 
37*bb4ee6a4SAndroid Build Coastguard Worker         rsdp.checksum = super::generate_checksum(&rsdp.as_bytes()[0..19]);
38*bb4ee6a4SAndroid Build Coastguard Worker         rsdp.extended_checksum = super::generate_checksum(rsdp.as_bytes());
39*bb4ee6a4SAndroid Build Coastguard Worker         rsdp
40*bb4ee6a4SAndroid Build Coastguard Worker     }
41*bb4ee6a4SAndroid Build Coastguard Worker 
len() -> usize42*bb4ee6a4SAndroid Build Coastguard Worker     pub fn len() -> usize {
43*bb4ee6a4SAndroid Build Coastguard Worker         std::mem::size_of::<RSDP>()
44*bb4ee6a4SAndroid Build Coastguard Worker     }
45*bb4ee6a4SAndroid Build Coastguard Worker }
46*bb4ee6a4SAndroid Build Coastguard Worker 
47*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(test)]
48*bb4ee6a4SAndroid Build Coastguard Worker mod tests {
49*bb4ee6a4SAndroid Build Coastguard Worker     use zerocopy::AsBytes;
50*bb4ee6a4SAndroid Build Coastguard Worker 
51*bb4ee6a4SAndroid Build Coastguard Worker     use super::RSDP;
52*bb4ee6a4SAndroid Build Coastguard Worker 
53*bb4ee6a4SAndroid Build Coastguard Worker     #[test]
test_rsdp()54*bb4ee6a4SAndroid Build Coastguard Worker     fn test_rsdp() {
55*bb4ee6a4SAndroid Build Coastguard Worker         let rsdp = RSDP::new(*b"CHYPER", 0xdead_beef);
56*bb4ee6a4SAndroid Build Coastguard Worker         let sum = rsdp
57*bb4ee6a4SAndroid Build Coastguard Worker             .as_bytes()
58*bb4ee6a4SAndroid Build Coastguard Worker             .iter()
59*bb4ee6a4SAndroid Build Coastguard Worker             .fold(0u8, |acc, x| acc.wrapping_add(*x));
60*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(sum, 0);
61*bb4ee6a4SAndroid Build Coastguard Worker         let sum: u8 = rsdp
62*bb4ee6a4SAndroid Build Coastguard Worker             .as_bytes()
63*bb4ee6a4SAndroid Build Coastguard Worker             .iter()
64*bb4ee6a4SAndroid Build Coastguard Worker             .fold(0u8, |acc, x| acc.wrapping_add(*x));
65*bb4ee6a4SAndroid Build Coastguard Worker         assert_eq!(sum, 0);
66*bb4ee6a4SAndroid Build Coastguard Worker     }
67*bb4ee6a4SAndroid Build Coastguard Worker }
68