diff options
| author | andromeda <andromeda@bsd.my.domain> | 2026-10-21 23:03:26 -0400 |
|---|---|---|
| committer | andromeda <andromeda@bsd.my.domain> | 2026-10-21 23:03:26 -0400 |
| commit | 32ff1b81922209059e474268f2288328f2fac743 (patch) | |
| tree | 32b5d41e595175429bc8bea26522e9341cb4d3a8 /lib/acpi.c3l | |
| parent | 4a06a0a7519089caad53f72c8c8c2ebc3592091e (diff) | |
initial acpi support
Diffstat (limited to 'lib/acpi.c3l')
| -rw-r--r-- | lib/acpi.c3l/acpi.c3 | 170 | ||||
| -rw-r--r-- | lib/acpi.c3l/manifest.json | 9 |
2 files changed, 179 insertions, 0 deletions
diff --git a/lib/acpi.c3l/acpi.c3 b/lib/acpi.c3l/acpi.c3 new file mode 100644 index 0000000..26021dc --- /dev/null +++ b/lib/acpi.c3l/acpi.c3 @@ -0,0 +1,170 @@ +module acpi; + +import c3os::util; + +extern fn int memcmp(void*, void*, usz); + +alias Oemid = char[6]; + +excuse INVALID_DESCRIPTION_HEADER; + +enum DescriptionHeaderSignature +{ + AEST, + AGDI, + APIC, + APMT, + ASPT, + BDAT, + BERT, + BGRT, + BOOT, + CCEL, + CEDT, + CPEP, + CSRT, + DBGP, + DBG2, + DMAR, + DRTM, + DSDT, + DTPR, + ECDT, + EINJ, + ERST, + ETDT, + FACP, + FACS, + FPDT, + GTDT, + HEST, + HPET, + IBFT, + IERS, + IORT, + IOVT, + IRDT, + IVRS, + KEYP, + LPIT, + MCFG, + MCHI, + MHSP, + MISC, + MPAM, + MPST, + MSCT, + MSDM, + NBFT, + NFIT, + NHLT, + PCCT, + PHAT, + PMTT, + PPTT, + PRMT, + PSDT, + RASF, + RAS2, + RGRT, + RHCT, + RIMT, + RQSC, + RSDT, + SBST, + SDEI, + SDEV, + SLIC, + SLIT, + SPCR, + SPMI, + SRAT, + SSDT, + STAO, + SVKL, + SWFT, + TCPA, + TPM2, + UEFI, + WAET, + WDAT, + WDDT, + WDRT, + WPBT, + WSMT, + XENV, + XSDT, +} + +$assert(DescriptionHeader::size == 36); +$assert(RootSystemDescriptionPointer::size == 35); +struct RootSystemDescriptionPointer @packed +{ + char[8] signature; + char checksum; + Oemid oemid; + char revision; + uint rsdtAddress; + uint length; + ExtendedSystemDescriptionTable* xsdtAddress; + char[3] _res; +} + +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); +} + +$assert(ExtendedSystemDescriptionTable::size == 36); +struct ExtendedSystemDescriptionTable @packed +{ + inline DescriptionHeader header; + ulong[*] descriptionHeaders; +} + +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; +} + +struct DescriptionHeader @packed +{ + char[4] signature; + uint length; + char revision; + char checksum; + Oemid oemid; + char[8] oemTableId; + uint oemRevision; + uint creatorId; + uint creatorRevision; +} + +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~; +} diff --git a/lib/acpi.c3l/manifest.json b/lib/acpi.c3l/manifest.json new file mode 100644 index 0000000..f2a0965 --- /dev/null +++ b/lib/acpi.c3l/manifest.json @@ -0,0 +1,9 @@ +{ + "provides": "acpi", + "sources": [ + "**" + ], + "targets": { + "windows-x64": {} + } +} |
