rk/acpi.c
2024-05-21 21:07:04 -05:00

58 lines
1.3 KiB
C

#include <acpi.h>
#include <strcmp.h>
struct rsdp *acpi_locate_rsdp() {
char *ptr = (char *)BIOS_START;
char *str = RSDP_SIG;
while ((uint32_t)ptr <= (uint32_t)BIOS_END - RSDP_SIG_LEN) {
int i;
for (i = 0; i < RSDP_SIG_LEN; i++) {
if (ptr[i] != str[i])
break;
}
if (i == RSDP_SIG_LEN) {
return (struct rsdp *)ptr;
}
ptr++;
}
return 0;
}
int acpi_validate_rsdp_checksum(struct rsdp *s) {
uint8_t *bytes = (uint8_t *)s;
uint8_t sum = 0;
for (int i = 0; i < RSDP_SIZE; i++) {
sum += bytes[i];
}
return (sum & 0x0F) == 0;
}
int acpi_validate_sdt_checksum(struct ACPISDTHeader *s) {
uint8_t sum = 0;
for (uint32_t i = 0; i < s->Length; i++) {
sum += ((char *)s)[i];
}
return sum == 0;
}
void *acpi_locate_sdt(struct rsdt *rsdt, const char sig[4]) {
int entries = (rsdt->h.Length - sizeof(rsdt->h)) / 4;
for (int i = 0; i < entries; i++)
{
struct ACPISDTHeader *h = (struct ACPISDTHeader *) rsdt->other_sdt[i];
if (!strncmp(h->Signature, sig, 4)) {
if (acpi_validate_sdt_checksum(h))
return (void *) h;
else
return 0;
}
}
return 0;
}