40 lines
833 B
C
40 lines
833 B
C
#include <acpi.h>
|
|
|
|
struct rsdp *acpi_search_for_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;
|
|
}
|