static void test_acpi_rsdt_table(test_data *data) { AcpiRsdtDescriptorRev1 *rsdt_table = &data->rsdt_table; uint32_t addr = data->rsdp_table.rsdt_physical_address; uint32_t *tables; int tables_nr; uint8_t checksum; /* read the header */ ACPI_READ_TABLE_HEADER(rsdt_table, addr); ACPI_ASSERT_CMP(rsdt_table->signature, "RSDT"); /* compute the table entries in rsdt */ tables_nr = (rsdt_table->length - sizeof(AcpiRsdtDescriptorRev1)) / sizeof(uint32_t); g_assert_cmpint(tables_nr, >, 0); /* get the addresses of the tables pointed by rsdt */ tables = g_new0(uint32_t, tables_nr); ACPI_READ_ARRAY_PTR(tables, tables_nr, addr); checksum = acpi_checksum((uint8_t *)rsdt_table, rsdt_table->length) + acpi_checksum((uint8_t *)tables, tables_nr * sizeof(uint32_t)); g_assert(!checksum); /* SSDT tables after FADT */ data->rsdt_tables_addr = tables; data->rsdt_tables_nr = tables_nr; }
static void test_dst_table(AcpiSdtTable *sdt_table, uint32_t addr) { uint8_t checksum; ACPI_READ_TABLE_HEADER(&sdt_table->header, addr); sdt_table->aml_len = sdt_table->header.length - sizeof(AcpiTableHeader); sdt_table->aml = g_malloc0(sdt_table->aml_len); ACPI_READ_ARRAY_PTR(sdt_table->aml, sdt_table->aml_len, addr); checksum = acpi_checksum((uint8_t *)sdt_table, sizeof(AcpiTableHeader)) + acpi_checksum((uint8_t *)sdt_table->aml, sdt_table->aml_len); g_assert(!checksum); }
/** fetch_table * load ACPI table at @addr into table descriptor @sdt_table * and check that header checksum matches actual one. */ static void fetch_table(AcpiSdtTable *sdt_table, uint32_t addr) { uint8_t checksum; memset(sdt_table, 0, sizeof(*sdt_table)); ACPI_READ_TABLE_HEADER(&sdt_table->header, addr); sdt_table->aml_len = le32_to_cpu(sdt_table->header.length) - sizeof(AcpiTableHeader); sdt_table->aml = g_malloc0(sdt_table->aml_len); ACPI_READ_ARRAY_PTR(sdt_table->aml, sdt_table->aml_len, addr); checksum = acpi_calc_checksum((uint8_t *)sdt_table, sizeof(AcpiTableHeader)) + acpi_calc_checksum((uint8_t *)sdt_table->aml, sdt_table->aml_len); g_assert(!checksum); }