summaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpi.cpp
blob: 41a7aa70844c436158f1cfdd2a29dc180d044fab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include "acpi.h"
#include "StringOperations.h"


Rsdp::Rsdp() : rsdpStruct(nullptr), rsdtObj(nullptr), xsdtObj(nullptr)
{
    rsdpStruct = (struct rsdp *)StringOperations::findInMemory(rsdpSign, rsdpRomMemArea);

    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
{
    if(rsdpStruct != nullptr) return &rsdtObj;
    else return nullptr;
};

Rsdt::Rsdt(const nulltype null) : entry(null)
{
    rsdtStruct = null;
};

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
{
    if(rsdpStruct != nullptr) return &xsdtObj;
    else return nullptr;
};

Xsdt::Xsdt(const nulltype null)
{
    xsdtStruct = nullptr;
};

Xsdt::Xsdt(const uint32 xsdt)
{
    xsdtStruct = (const struct xsdt *)(xsdt);
};

Entry::Entry(const uint32 rsdtLength, const uint32 *entryAddress)
{
    sizeHeadersInBytes = rsdtLength - sizeof(descHeader);
    headers = (const struct descHeader **)(entryAddress);
};

Entry::Entry(const nulltype null)
{
    sizeHeadersInBytes = 0;
    headers = null;
};