[Stage1] Add HEX display to screen.h [Stage1] Handle IRQ1 semi-gracefully [Stage1] Try (unsuccessfully) to "wait" for IRQ 1 (os_interrupt_wait())
45 lines
No EOL
1.1 KiB
C
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;
|
|
} |