Cucumber/Kernel/src/Tier0/acpi.c

62 lines
1.6 KiB
C

#include "Tier0/acpi.h"
#include "Tier0/kstdio.h"
u8 g_acpi_version = 0;
u32 g_acpi_rsdt_address = 0;
u64 acpi_find_rsdp(void)
{
s8 *szMagic = "RSD PTR ";
// Try to find the pointer... apparently it's 16byte-aligned...
u64 Address = 0;
for (u64 Search = 0x000E0000; Search <= 0x000FFFFF; Search += 4)
{
if (kmemcmp((u8 *)Search, (u8 *)szMagic, 8) == 0)
{
u8 ChecksumVerify = 0;
for (u8 i = 0; i < ACPI_10_RSDP_SIZE; i++)
ChecksumVerify += ((u8*)Search)[i];
if (ChecksumVerify == 0)
{
if (((T_ACPI_RSDP *)Search)->Revision == 1)
{
ChecksumVerify = 0;
for (u8 i = ACPI_10_RSDP_SIZE; i < ACPI_20_RSDP_SIZE; i++)
ChecksumVerify += ((u8*)Search)[i];
if (ChecksumVerify == 0)
{
Address = Search;
break;
}
}
else
{
Address = Search;
break;
}
}
}
}
if (Address == 0)
return 0;
T_ACPI_RSDP *RSDP = (T_ACPI_RSDP *)Address;
g_acpi_version = RSDP->Revision + 1;
kprintf("[i] Detected ACPI version %i.0.\n", RSDP->Revision + 1);
if (*RSDP->OEMID != 0)
kprintf("[i] OEMID %s.\n", RSDP->OEMID);
if (g_acpi_version == ACPI_VERSION_10)
g_acpi_rsdt_address = Address;
else
g_acpi_rsdt_address = RSDP->RSDTAddressExLow;
return Address;
}