diff options
Diffstat (limited to 'drivers/acpi/acpi.cpp')
| -rw-r--r-- | drivers/acpi/acpi.cpp | 86 |
1 files changed, 38 insertions, 48 deletions
diff --git a/drivers/acpi/acpi.cpp b/drivers/acpi/acpi.cpp index 41a7aa7..25dad9d 100644 --- a/drivers/acpi/acpi.cpp +++ b/drivers/acpi/acpi.cpp @@ -1,71 +1,61 @@ #include "acpi.h" -#include "StringOperations.h" -Rsdp::Rsdp() : rsdpStruct(nullptr), rsdtObj(nullptr), xsdtObj(nullptr) -{ - rsdpStruct = (struct rsdp *)StringOperations::findInMemory(rsdpSign, rsdpRomMemArea); +const char *Rsdp::signatureString = "RSD PTR "; +const uint8 Rsdp::validFieldRevision = 2; +const memAddr Rsdp::romAreaStart = 0xe0000; +const memAddr Rsdp::romAreaEnd = 0xfffff; +const memAddr Rsdp::ebdaAreaStart = 0x80000; +const memAddr Rsdp::ebdaAreaEnd = 0x803ff; +const uint8 Rsdp::checksunFieldSize = 20; +// Entry **Rsdt::entries = nullptr; - if(rsdpStruct == nullptr) - { - rsdpStruct = (struct rsdp *)StringOperations::findInMemory(rsdpSign, rsdpEbdaMemArea); - } - - if(rsdpStruct != nullptr) - { - rsdtObj = Rsdt(rsdpStruct->rsdtAddress); - if(rsdpStruct->revision >= validFieldRevision) - { - xsdtObj = Xsdt(rsdpStruct->xsdtAddress); - } - } -}; - -const Rsdt *Rsdp::getRsdt() const +Rsdt *Rsdp::getRsdt() const { - if(rsdpStruct != nullptr) return &rsdtObj; - else return nullptr; + Rsdt *rsdtPtr = (Rsdt *)(rsdtAddress); + if(rsdtPtr == nullptr or checksumCheck()) return nullptr; + else return rsdtPtr; }; -Rsdt::Rsdt(const nulltype null) : entry(null) +Xsdt *Rsdp::getXsdt() const { - rsdtStruct = null; + Xsdt *xsdtPtr = (Xsdt *)(xsdtAddress); + if(xsdtPtr == nullptr or checksumCheck()) return nullptr; + else return xsdtPtr; }; -Rsdt::Rsdt(const uint32 addrRsdt) : entry(nullptr) -{ - rsdtStruct = (const struct rsdt *)(addrRsdt); - if(rsdtStruct != nullptr) - { - entry = Entry(rsdtStruct->header.length, - (&rsdtStruct->firstEntryAddr)); - } -}; -const Xsdt *Rsdp::getXsdt() const +const uint32 DescHeader::getLength() const { - if(rsdpStruct != nullptr) return &xsdtObj; - else return nullptr; + return length; }; -Xsdt::Xsdt(const nulltype null) +const Entry *Rsdt::getEntry(uint8 index) { - xsdtStruct = nullptr; -}; + uint32 entriesAmount = (header.getLength() - sizeof(DescHeader)) / Entry::size; -Xsdt::Xsdt(const uint32 xsdt) -{ - xsdtStruct = (const struct xsdt *)(xsdt); + if(index >= entriesAmount + or entries == nullptr + or header.checksumCheck()) return nullptr; + else return ((const Entry **)&entries)[index]; }; -Entry::Entry(const uint32 rsdtLength, const uint32 *entryAddress) +uint8 Rsdp::checksumCheck() const { - sizeHeadersInBytes = rsdtLength - sizeof(descHeader); - headers = (const struct descHeader **)(entryAddress); + uint8 check = 0; + for(uint32 offset = 0; offset < checksunFieldSize; offset++) + { + check += *(uint8 *)((memAddr)this + offset); + } + return check; }; -Entry::Entry(const nulltype null) +uint8 DescHeader::checksumCheck() const { - sizeHeadersInBytes = 0; - headers = null; + uint8 check = 0; + for(uint32 offset = 0; offset < length; offset++) + { + check += *(uint8 *)((memAddr)this + offset); + } + return check; }; |
