#include "include/acpi.h" #include "include/utils.h" OS_ACPI_Header* acpi_rsdt; OS_ACPI_Header** acpi_root_tables; os_u32 acpi_root_tables_amount; os_bool os_check_acpi(OS_ACPI_Header* header) { os_u32 len = header->length; os_u8* ptr = (os_u8*)header; os_u8 sum = 0; for(os_u32 i = 0; i < len; i++) { sum += *ptr; ++ptr; } return sum == 0 ? OS_TRUE : OS_FALSE; } os_bool os_acpi_init(OS_RSDPDescriptor* desc) { OS_ACPI_Header* rsdt_header = (OS_ACPI_Header*)desc->rsdt_address; if (os_check_acpi(rsdt_header) == OS_FALSE) { return OS_FALSE; } acpi_rsdt = rsdt_header; acpi_root_tables = (OS_ACPI_Header**) (((os_u32)acpi_rsdt) + sizeof(OS_ACPI_Header)); acpi_root_tables_amount = (acpi_rsdt->length - sizeof(OS_ACPI_Header)) / sizeof(OS_ACPI_Header*); return OS_TRUE; } OS_ACPI_Header* os_acpi_find_table(os_u8* sig) { for(os_u32 i = 0; i < acpi_root_tables_amount; i++) { OS_ACPI_Header* h = acpi_root_tables[i]; if(os_data_compare(sig, (os_u8*)h->signature, 4) == OS_TRUE && os_check_acpi(h) == OS_TRUE) { return h; } } return (OS_ACPI_Header*)0; }