use crate::{rsdt::RootSystemDescriptionTable, xsdt::ExtendedSystemDescriptionTable};
#[derive(Copy, Clone)]
#[repr(C, packed)]
pub struct RootSystemDescriptionPointer {
pub signature: [u8; 8],
pub checksum: u8,
pub oemid: [u8; 6],
pub revision: u8,
pub rsdt_address: u32,
pub length: u32,
pub xsdt_address: u64,
pub extended_checksum: u8,
reserved: [u8; 3],
}
impl RootSystemDescriptionPointer {
pub const fn validate_signature(&self) -> bool {
self.signature[0] == b'R'
&& self.signature[1] == b'S'
&& self.signature[2] == b'D'
&& self.signature[3] == b' '
&& self.signature[4] == b'P'
&& self.signature[5] == b'T'
&& self.signature[6] == b'R'
&& self.signature[7] == b' '
}
pub const fn validate_sdt_signature(&self) -> bool {
unsafe {
if self.revision < 2 {
(&*(self.rsdt_address as usize as *const RootSystemDescriptionTable))
.header
.signature[0]
== b'R'
&& (&*(self.rsdt_address as usize as *const RootSystemDescriptionTable))
.header
.signature[1]
== b'S'
&& (&*(self.rsdt_address as usize as *const RootSystemDescriptionTable))
.header
.signature[2]
== b'D'
&& (&*(self.rsdt_address as usize as *const RootSystemDescriptionTable))
.header
.signature[3]
== b'T'
} else {
(&*(self.xsdt_address as usize as *const ExtendedSystemDescriptionTable))
.header
.signature[0]
== b'X'
&& (&*(self.xsdt_address as usize as *const ExtendedSystemDescriptionTable))
.header
.signature[1]
== b'S'
&& (&*(self.xsdt_address as usize as *const ExtendedSystemDescriptionTable))
.header
.signature[2]
== b'D'
&& (&*(self.xsdt_address as usize as *const ExtendedSystemDescriptionTable))
.header
.signature[3]
== b'T'
}
}
}
}