os3/stage1/acpi.c
John Stefanelli 7a1f072e4a
[Stage1] Add RSDP and basic ACPI parsing
[Stage1] Add HEX display to screen.h
[Stage1] Handle IRQ1 semi-gracefully
[Stage1] Try (unsuccessfully) to "wait" for IRQ 1 (os_interrupt_wait())
2023-06-05 13:13:37 +02:00

45 lines
No EOL
1.1 KiB
C

#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;
}