12static bool validate_acpi_chksum(uint8_t* data,
size_t len) {
15 for (
size_t i = 0; i < len; i++) {
23static void map_physical_range(uint64_t phys,
size_t length, uint32_t
flags) {
24 uint64_t start = phys & 0xFFFULL;
33static void* MiFindACPIHeader(XSDT* xsdt,
const char* headerSignature) {
34 uint32_t xsdt_len = xsdt->h.Length;
35 if (xsdt_len <
sizeof(ACPI_SDT_HEADER))
return NULL;
36 uint32_t entries = (xsdt_len -
sizeof(ACPI_SDT_HEADER)) /
sizeof(uint64_t);
40 for (uint32_t i = 0; i < entries; ++i) {
41 uint64_t headerPhys = xsdt->Entries[i];
46 if (
kmemcmp(hdr->Signature, headerSignature, 4) == 0) {
50 uint32_t table_len = hdr->Length;
51 if (table_len <
sizeof(ACPI_SDT_HEADER)) {
53 gop_printf(
COLOR_RED,
"Iteration %d, table_len < sizeof(ACPI_SDT_HEADER), continuing...\n", i);
60 if (!validate_acpi_chksum((uint8_t*)hdr, table_len)) {
gop_printf(
COLOR_RED,
"ACPI Checksum invalid..\n");
continue; }
68 gop_printf(
COLOR_RED,
"Signature for iteration %d isn't valid... Pointer (physical): %p\n", i, (
void*)(uintptr_t)headerPhys);
103 if (
fadt->ResetReg.Address == 0) {
109 switch (
fadt->ResetReg.AddressSpace) {
111 port = (uint16_t)
fadt->ResetReg.Address;
115 phys =
fadt->ResetReg.Address;
119 volatile uint8_t* reg = (
volatile uint8_t*)phys;
120 *reg =
fadt->ResetValue;
124 fadt->ResetReg.AddressSpace);
136 uint8_t* ptr = (uint8_t*)
madt +
sizeof(MADT);
138 uint8_t* end = (uint8_t*)
madt +
madt->h.Length;
140 while (ptr < end && count < maxCPUs) {
141 uint8_t type = ptr[0];
142 uint8_t len = ptr[1];
146 MADT_LOCAL_APIC* lapic = (MADT_LOCAL_APIC*)ptr;
147 if (lapic->Flags & 1) {
150 buffer[count++] = lapic->ApicId;
171 if (
kmemcmp(rsdp->Signature,
"RSD PTR ", 8) != 0)
return (
MTSTATUS)0xC000BABE;
173 uint64_t xsdtPhys = 0;
174 if (rsdp->Revision >= 2 && rsdp->Length >=
sizeof(RSDP_Descriptor)) {
177 if (!validate_acpi_chksum((uint8_t*)rsdp, rsdp->Length))
return MT_INVALID_CHECK;
178 xsdtPhys = rsdp->XsdtAddress;
180 if (!xsdtPhys)
return (
MTSTATUS)0xC000BEEF;
191 ACPI_SDT_HEADER* facp = (ACPI_SDT_HEADER*)MiFindACPIHeader(xsdt,
"FACP");
198 ACPI_SDT_HEADER* madtACPI = (ACPI_SDT_HEADER*)MiFindACPIHeader(xsdt,
"APIC");
201 madt = (MADT*)madtACPI;
void MhRebootComputer(void)
BOOT_INFO boot_info_local
MTSTATUS MhParseLAPICs(uint8_t *buffer, size_t maxCPUs, uint32_t *cpuCount, uint32_t *lapicAddress)
MTSTATUS MhInitializeACPI(void)
struct _BOOT_INFO BOOT_INFO
void gop_printf(uint32_t color, const char *fmt,...)
FORCEINLINE void __outbyte(unsigned short port, unsigned char val)
PMMPTE MiGetPtePointer(IN uintptr_t va)
#define COLOR_RED
Colors definitions for easier access.
FORCEINLINE int kmemcmp(const void *s1, const void *s2, size_t n)
#define PhysicalMemoryOffset
#define MI_WRITE_PTE(_PtePointer, _Va, _Pa, _Flags)
#define MT_GENERAL_FAILURE
#define MT_INVALID_ADDRESS