summaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpi.cpp
diff options
context:
space:
mode:
authorAlexey Gavrilov <rebovas@yahoo.com>2024-03-25 11:24:38 +0700
committerAlexey Gavrilov <rebovas@yahoo.com>2024-03-25 11:24:38 +0700
commitbbac386769210a8ecccba5826cfaf75d431cc2af (patch)
tree07e5602ec7c694e2302327de54163280a342d3c1 /drivers/acpi/acpi.cpp
parentd8a708d4a2c612c348cf7c108a7c1ad683b394d8 (diff)
Acpi classes + string operations
Diffstat (limited to 'drivers/acpi/acpi.cpp')
-rw-r--r--drivers/acpi/acpi.cpp86
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;
};