diff options
| author | Alexey Gavrilov <90127298+rebovas@users.noreply.github.com> | 2024-03-27 19:50:26 +0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-27 19:50:26 +0700 |
| commit | a276644952ed018e77ca64181059434a6bc4ee62 (patch) | |
| tree | e6a457ec4b2758c0c3bef78df475ad52d92a7ab4 /drivers/acpi/Acpi.cpp | |
| parent | 91b4d8fa6bed598e2969f16a7a953e293a1b7f89 (diff) | |
| parent | e51dea0b6e34c2959b3b0f4a5db6b11d4b619960 (diff) | |
Merge pull request #5 from rebovas/acpi_madt
Acpi madt + some updates
Diffstat (limited to 'drivers/acpi/Acpi.cpp')
| -rw-r--r-- | drivers/acpi/Acpi.cpp | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/acpi/Acpi.cpp b/drivers/acpi/Acpi.cpp new file mode 100644 index 0000000..6551c6a --- /dev/null +++ b/drivers/acpi/Acpi.cpp @@ -0,0 +1,83 @@ +#include "Acpi.h" + + +const char *Rsdp::signatureString = "RSD PTR "; +const uint8 Rsdp::validFieldRevision = 2; +const uintptr Rsdp::romAreaStart = 0xe0000; +const uintptr Rsdp::romAreaEnd = 0xfffff; +const uintptr Rsdp::ebdaAreaStart = 0x80000; +const uintptr Rsdp::ebdaAreaEnd = 0x803ff; +const uint8 Rsdp::checksunFieldSize = 20; +const uint8 Entry::size = 4; +const uint8 sizeWithoutIcs = 44; + +Rsdt *Rsdp::getRsdt() const +{ + Rsdt *rsdtPtr = (Rsdt *)(rsdtAddress); + if(rsdtPtr == nullptr or checksumCheck()) return nullptr; + else return rsdtPtr; +}; + +Xsdt *Rsdp::getXsdt() const +{ + Xsdt *xsdtPtr = (Xsdt *)(xsdtAddress); + if(xsdtPtr == nullptr or checksumCheck()) return nullptr; + else return xsdtPtr; +}; + + +const uint32 DescHeader::getLength() const +{ + return length; +}; + +const Entry *Rsdt::getEntry(uint8 index) const +{ + uint32 entriesAmount = (header.getLength() - sizeof(DescHeader)) / Entry::size; + + if(index >= entriesAmount + or header.checksumCheck()) return nullptr; + else return ((const Entry **)&entries)[index]; +}; + +uint8 Rsdp::checksumCheck() const +{ + uint8 check = 0; + for(uint32 offset = 0; offset < checksunFieldSize; offset++) + { + check += *(uint8 *)((uintptr)this + offset); + } + return check; +}; + +uint8 DescHeader::checksumCheck() const +{ + uint8 check = 0; + for(uint32 offset = 0; offset < length; offset++) + { + check += *(uint8 *)((uintptr)this + offset); + } + return check; +}; + +const Ics *Madt::getIcs(uint8 index) const +{ + if(header.checksumCheck()) return nullptr; + + uint32 icsBytesRemain = header.getLength() - ::sizeWithoutIcs; + uint16 indexAmass = 0; + const Ics *icsPtr = (Ics *)(&icsBegin); + + while(icsBytesRemain > 0) + { + if(indexAmass == index) return icsPtr; + else + { + icsBytesRemain -= icsPtr->getLength(); + indexAmass++; + icsPtr = (Ics *)((uintptr)icsPtr + icsPtr->getLength()); + } + } + + return nullptr; +}; |
