use crate::TagType;
use core::slice;
use core::str;
use core::str::Utf8Error;
const RSDPV1_LENGTH: usize = 20;
#[derive(Clone, Copy, Debug)]
#[repr(C, packed)]
pub struct RsdpV1Tag {
typ: TagType,
size: u32,
signature: [u8; 8],
checksum: u8,
oem_id: [u8; 6],
revision: u8,
rsdt_address: u32, }
impl RsdpV1Tag {
pub fn signature(&self) -> Result<&str, Utf8Error> {
str::from_utf8(&self.signature)
}
pub fn checksum_is_valid(&self) -> bool {
let bytes =
unsafe { slice::from_raw_parts(self as *const _ as *const u8, RSDPV1_LENGTH + 8) };
bytes[8..]
.iter()
.fold(0u8, |acc, val| acc.wrapping_add(*val))
== 0
}
pub fn oem_id(&self) -> Result<&str, Utf8Error> {
str::from_utf8(&self.oem_id)
}
pub fn revision(&self) -> u8 {
self.revision
}
pub fn rsdt_address(&self) -> usize {
self.rsdt_address as usize
}
}
#[derive(Clone, Copy, Debug)]
#[repr(C, packed)]
pub struct RsdpV2Tag {
typ: TagType,
size: u32,
signature: [u8; 8],
checksum: u8,
oem_id: [u8; 6],
revision: u8,
_rsdt_address: u32,
length: u32,
xsdt_address: u64, ext_checksum: u8,
_reserved: [u8; 3],
}
impl RsdpV2Tag {
pub fn signature(&self) -> Result<&str, Utf8Error> {
str::from_utf8(&self.signature)
}
pub fn checksum_is_valid(&self) -> bool {
let bytes = unsafe {
slice::from_raw_parts(self as *const _ as *const u8, self.length as usize + 8)
};
bytes[8..]
.iter()
.fold(0u8, |acc, val| acc.wrapping_add(*val))
== 0
}
pub fn oem_id(&self) -> Result<&str, Utf8Error> {
str::from_utf8(&self.oem_id)
}
pub fn revision(&self) -> u8 {
self.revision
}
pub fn xsdt_address(&self) -> usize {
self.xsdt_address as usize
}
pub fn ext_checksum(&self) -> u8 {
self.ext_checksum
}
}