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