Files
MontaukOS/kernel/src/ACPI/MADT.hpp
T

83 lines
2.2 KiB
C++

/*
* MADT.hpp
* Multiple APIC Description Table parsing
* Copyright (c) 2025 Daniel Hammer
*/
#pragma once
#include <cstdint>
#include <ACPI/ACPI.hpp>
namespace Hal {
namespace MADT {
struct Header {
Hal::ACPI::CommonSDTHeader SDTHeader;
uint32_t LocalApicAddress;
uint32_t Flags;
}__attribute__((packed));
struct EntryHeader {
uint8_t Type;
uint8_t Length;
}__attribute__((packed));
// Type 0: Processor Local APIC
struct LocalApicEntry {
EntryHeader Header;
uint8_t ProcessorId;
uint8_t ApicId;
uint32_t Flags;
}__attribute__((packed));
// Type 1: I/O APIC
struct IoApicEntry {
EntryHeader Header;
uint8_t IoApicId;
uint8_t Reserved;
uint32_t IoApicAddress;
uint32_t GlobalSystemInterruptBase;
}__attribute__((packed));
// Type 2: Interrupt Source Override
struct InterruptSourceOverride {
EntryHeader Header;
uint8_t BusSource;
uint8_t IrqSource;
uint32_t GlobalSystemInterrupt;
uint16_t Flags;
}__attribute__((packed));
// Type 4: Non-Maskable Interrupt
struct NmiEntry {
EntryHeader Header;
uint8_t ProcessorId;
uint16_t Flags;
uint8_t Lint;
}__attribute__((packed));
// Type 5: Local APIC Address Override
struct LocalApicAddressOverride {
EntryHeader Header;
uint16_t Reserved;
uint64_t LocalApicAddress;
}__attribute__((packed));
struct ParsedMADT {
uint64_t LocalApicAddress;
uint64_t IoApicAddress;
uint8_t IoApicId;
uint32_t IoApicGsiBase;
static constexpr int MaxOverrides = 16;
InterruptSourceOverride Overrides[MaxOverrides];
int OverrideCount;
static constexpr int MaxLocalApics = 16;
LocalApicEntry LocalApics[MaxLocalApics];
int LocalApicCount;
};
bool Parse(ACPI::CommonSDTHeader* xsdt, ParsedMADT& result);
};
};