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