Cucumber/Kernel/src/Tier0/acpi.c

62 lines
1.6 KiB
C
Raw Permalink Normal View History

2011-02-22 17:09:58 +00:00
#include "Tier0/acpi.h"
#include "Tier0/kstdio.h"
u8 g_acpi_version = 0;
u32 g_acpi_rsdt_address = 0;
2011-08-27 20:17:54 +00:00
u64 acpi_find_rsdp(void)
2011-02-22 17:09:58 +00:00
{
s8 *szMagic = "RSD PTR ";
// Try to find the pointer... apparently it's 16byte-aligned...
2011-06-28 11:15:42 +00:00
u64 Address = 0;
for (u64 Search = 0x000E0000; Search <= 0x000FFFFF; Search += 4)
2011-02-22 17:09:58 +00:00
{
if (kmemcmp((u8 *)Search, (u8 *)szMagic, 8) == 0)
{
2011-02-22 23:30:28 +00:00
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;
}
}
2011-02-22 17:09:58 +00:00
}
}
if (Address == 0)
return 0;
2011-02-22 23:30:28 +00:00
T_ACPI_RSDP *RSDP = (T_ACPI_RSDP *)Address;
2011-02-22 17:09:58 +00:00
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;
}