aboutsummaryrefslogtreecommitdiffstats
path: root/acpi.cpp
blob: b74a7dc1496b05474b41b415c143b40d5f2f3674 (plain)
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
#include "textoutput.hpp"

#include <cstdint>

extern TextOutput& term;
extern std::uint32_t *acpiRsdp;
extern std::uint32_t *acpiRsdpV2;

struct XSDP {
   char Signature[8];
   std::uint8_t Checksum;
   char OEMID[6];
   std::uint8_t Revision;
   std::uint32_t RsdtAddress;      // deprecated since version 2.0

   // v2 only!
   std::uint32_t Length;
   std::uint64_t XsdtAddress;
   std::uint8_t ExtendedChecksum;
   std::uint8_t reserved[3];
} __attribute__ ((packed));

struct SDTHeader {
    char Signature[4];
    std::uint32_t Length;
    std::uint8_t Revision;
    std::uint8_t Checksum;
    char OEMID[6];
    char OEMTableID[8];
    std::uint32_t OEMRevision;
    std::uint32_t CreatorID;
    std::uint32_t CreatorRevision;
};

static XSDP *rsdp = nullptr;

void acpi_initialize()
{
    if (acpiRsdp) {
        term.write("ACPI v1 detected.\n");
        rsdp = reinterpret_cast<XSDP *>(acpiRsdp);
    } else if (acpiRsdpV2) {
        term.write("ACPI v2 detected, treating as v1.\n");
        rsdp = reinterpret_cast<XSDP *>(acpiRsdpV2);
    }

    //if (rsdp) {
    //    auto sdt = reinterpret_cast<SDTHeader *>(rsdp->RsdtAddress);
    //}
}