module acpi; import c3os::util; extern fn int memcmp(void*, void*, usz); fn bool RootSystemDescriptionPointer.is_valid(&self) { if (memcmp(&self.signature, "RSD PTR ", 8) != 0) return false; if (self.revision != 2) return false; char sum = 0; for (int i = 0; i < 20; i++) sum += ((char*)self)[i]; if (sum != 0) return false; for (int i = 0; i < RootSystemDescriptionPointer::size; i++) sum += ((char*)self)[i]; return (sum == 0); } fn bool ExtendedSystemDescriptionTable.is_valid(&self) { if (memcmp(&self.signature, "XSDT", 4) != 0) return false; if (self.revision != 1) return false; char sum = 0; for (uint i = 0; i < self.length; i++) sum += ((char*)self)[i]; if (sum != 0) return false; return true; } fn bool DescriptionHeader.is_valid(&self) { if (catch excuse = self.sig()) return false; char sum = 0; for (uint i = 0; i < self.length; i++) sum += ((char*)self)[i]; if (sum != 0) return false; return true; } fn DescriptionHeaderSignature? DescriptionHeader.sig(&self) { foreach (i, name : DescriptionHeaderSignature::names) { if (memcmp(name, &self.signature, 4) == 0) return (DescriptionHeaderSignature)i; } return INVALID_DESCRIPTION_HEADER~; }