Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Refactor ACPI header file
  • Loading branch information
djphoenix committed May 28, 2019
1 parent b27ffd4 commit 1a76fb5
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 65 deletions.
63 changes: 58 additions & 5 deletions src/platform/acpi.cpp
Expand Up @@ -10,6 +10,60 @@
Mutex ACPI::controllerMutex;
volatile ACPI* ACPI::controller = nullptr;

enum LAPIC_VALUES {
LAPIC_DISABLE = 0x10000,
LAPIC_SW_ENABLE = 0x100,
LAPIC_CPUFOCUS = 0x200,
LAPIC_NMI = (4 << 8),
TMR_PERIODIC = 0x20000,
TMR_BASEDIV = (1 << 20),
};

enum IOAPIC_FIELDS {
IOAPIC_REGSEL = 0x0, IOAPIC_REGWIN = 0x10,
};

enum IOAPIC_REGS {
IOAPIC_ID = 0x0, IOAPIC_VER = 0x1, IOAPIC_REDTBL = 0x10,
};

struct ACPI::Header {
uint32_t signature;
uint32_t length;
uint8_t revision;
uint8_t checksum;
uint8_t oem[6];
uint8_t oemTableId[8];
uint32_t oemRevision;
uint32_t creatorId;
uint32_t creatorRevision;
};
struct ACPI::Madt : Header {
uint32_t localApicAddr;
uint32_t flags;
};
struct ACPI::ApicHeader {
uint8_t type;
uint8_t length;
};
struct ACPI::ApicLocalApic : ApicHeader {
uint8_t acpiProcessorId;
uint8_t apicId;
uint32_t flags;
};
struct ACPI::ApicIoApic : ApicHeader {
uint8_t ioApicId;
uint8_t reserved;
uint32_t ioApicAddress;
uint32_t globalSystemInterruptBase;
};
struct ACPI::ApicInterruptOverride : ApicHeader {
uint8_t bus;
uint8_t source;
uint32_t interrupt;
uint16_t flags;
};

ACPI* ACPI::getController() {
if (controller) return const_cast<ACPI*>(controller);
Mutex::CriticalLock lock(controllerMutex);
Expand Down Expand Up @@ -132,7 +186,7 @@ void ACPI::ParseApic(const Madt *madt) {
Pagetable::map(localApicAddr);

const uint8_t *p = reinterpret_cast<const uint8_t*>(madt + 1);
const uint8_t *end = p + (madt->header.length - sizeof(Madt));
const uint8_t *end = p + (madt->Header::length - sizeof(Madt));

while (p < end) {
const ApicHeader *header = reinterpret_cast<const ApicHeader*>(p);
Expand All @@ -141,15 +195,14 @@ void ACPI::ParseApic(const Madt *madt) {
uint16_t type = header->type;
uint16_t length = header->length;
if (type == 0) {
const ApicLocalApic *s = reinterpret_cast<const ApicLocalApic*>(p);
const ApicLocalApic *s = reinterpret_cast<const ApicLocalApic*>(header);
acpiCpuIds[acpiCpuCount++] = s->apicId;
} else if (type == 1) {
const ApicIoApic *s = reinterpret_cast<const ApicIoApic*>(p);
const ApicIoApic *s = reinterpret_cast<const ApicIoApic*>(header);
ioApicAddr = reinterpret_cast<char*>(uintptr_t(s->ioApicAddress));
Pagetable::map(ioApicAddr);
} else if (type == 2) {
const ApicInterruptOverride *s =
reinterpret_cast<const ApicInterruptOverride*>(p);
const ApicInterruptOverride *s = reinterpret_cast<const ApicInterruptOverride*>(header);
(void)s;
// TODO: handle interrupt overrides
}
Expand Down
67 changes: 7 additions & 60 deletions src/platform/include/acpi.hpp
Expand Up @@ -27,66 +27,6 @@ class ACPI {
LAPIC_TMRDIV = 0x3E0,
LAPIC_LAST = 0x38F,
};

private:
enum LAPIC_VALUES {
LAPIC_DISABLE = 0x10000,
LAPIC_SW_ENABLE = 0x100,
LAPIC_CPUFOCUS = 0x200,
LAPIC_NMI = (4 << 8),
TMR_PERIODIC = 0x20000,
TMR_BASEDIV = (1 << 20),
};

enum IOAPIC_FIELDS {
IOAPIC_REGSEL = 0x0, IOAPIC_REGWIN = 0x10,
};

enum IOAPIC_REGS {
IOAPIC_ID = 0x0, IOAPIC_VER = 0x1, IOAPIC_REDTBL = 0x10,
};

struct Header {
uint32_t signature;
uint32_t length;
uint8_t revision;
uint8_t checksum;
uint8_t oem[6];
uint8_t oemTableId[8];
uint32_t oemRevision;
uint32_t creatorId;
uint32_t creatorRevision;
};
struct Madt {
Header header;
uint32_t localApicAddr;
uint32_t flags;
};
struct ApicHeader {
uint8_t type;
uint8_t length;
};
struct ApicLocalApic {
ApicHeader header;
uint8_t acpiProcessorId;
uint8_t apicId;
uint32_t flags;
};
struct ApicIoApic {
ApicHeader header;
uint8_t ioApicId;
uint8_t reserved;
uint32_t ioApicAddress;
uint32_t globalSystemInterruptBase;
};
struct ApicInterruptOverride {
ApicHeader header;
uint8_t bus;
uint8_t source;
uint32_t interrupt;
uint16_t flags;
};

union IOApicRedir {
struct {
uint8_t vector :8;
Expand All @@ -104,6 +44,13 @@ class ACPI {
};

private:
struct Header;
struct Madt;
struct ApicHeader;
struct ApicLocalApic;
struct ApicIoApic;
struct ApicInterruptOverride;

static Mutex controllerMutex;
static volatile ACPI *controller;

Expand Down

0 comments on commit 1a76fb5

Please sign in to comment.