From 92146b7a0fe6d6f9df34eeb22dc8e33785a49a42 Mon Sep 17 00:00:00 2001 From: Igor Mammedov Date: Tue, 16 Jan 2018 16:30:26 +0100 Subject: tests: acpi: fix FADT not being compared to reference table It turns out that FADT isn't actually tested for changes against reference table, since it happens to be the 1st table in RSDT which is currently ignored. Fix it by making sure that all tables from RSDT are added to test list. NOTE: FADT contains guest allocated pointers to FACS/DSDT, zero them out so that possible FACS/DSDT address change won't affect test results. Signed-off-by: Igor Mammedov Reviewed-by: Michael S. Tsirkin Signed-off-by: Michael S. Tsirkin --- tests/bios-tables-test.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c index b354aaa..2b332ed 100644 --- a/tests/bios-tables-test.c +++ b/tests/bios-tables-test.c @@ -194,6 +194,35 @@ static void test_acpi_fadt_table(test_data *data) le32_to_cpu(fadt_table->length))); } +static void sanitize_fadt_ptrs(test_data *data) +{ + /* fixup pointers in FADT */ + int i; + + for (i = 0; i < data->tables->len; i++) { + AcpiSdtTable *sdt = &g_array_index(data->tables, AcpiSdtTable, i); + + if (memcmp(&sdt->header.signature, "FACP", 4)) { + continue; + } + + /* sdt->aml field offset := spec offset - header size */ + memset(sdt->aml + 0, 0, 4); /* sanitize FIRMWARE_CTRL(36) ptr */ + memset(sdt->aml + 4, 0, 4); /* sanitize DSDT(40) ptr */ + if (sdt->header.revision >= 3) { + memset(sdt->aml + 96, 0, 8); /* sanitize X_FIRMWARE_CTRL(132) ptr */ + memset(sdt->aml + 104, 0, 8); /* sanitize X_DSDT(140) ptr */ + } + + /* update checksum */ + sdt->header.checksum = 0; + sdt->header.checksum -= + acpi_calc_checksum((uint8_t *)sdt, sizeof(AcpiTableHeader)) + + acpi_calc_checksum((uint8_t *)sdt->aml, sdt->aml_len); + break; + } +} + static void test_acpi_facs_table(test_data *data) { AcpiFacsDescriptorRev1 *facs_table = &data->facs_table; @@ -248,14 +277,14 @@ static void test_acpi_dsdt_table(test_data *data) /* Load all tables and add to test list directly RSDT referenced tables */ static void fetch_rsdt_referenced_tables(test_data *data) { - int tables_nr = data->rsdt_tables_nr - 1; /* fadt is first */ + int tables_nr = data->rsdt_tables_nr; int i; for (i = 0; i < tables_nr; i++) { AcpiSdtTable ssdt_table; uint32_t addr; - addr = le32_to_cpu(data->rsdt_tables_addr[i + 1]); /* fadt is first */ + addr = le32_to_cpu(data->rsdt_tables_addr[i]); fetch_table(&ssdt_table, addr); /* Add table to ASL test tables list */ @@ -650,6 +679,8 @@ static void test_acpi_one(const char *params, test_data *data) test_acpi_dsdt_table(data); fetch_rsdt_referenced_tables(data); + sanitize_fadt_ptrs(data); + if (iasl) { if (getenv(ACPI_REBUILD_EXPECTED_AML)) { dump_aml_files(data, true); -- cgit v1.1 From e89e7ea620f866ab42cbaa2de964552a3d2f7494 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Thu, 8 Feb 2018 19:56:49 +0200 Subject: acpi-test: update FADT Previous commit ("tests: acpi: fix FADT not being compared to reference table") started tracking changes to the FADT. Generate the expected FACP files - apparently these weren't updated since 2013. Signed-off-by: Michael S. Tsirkin --- tests/acpi-test-data/pc/FACP | Bin 116 -> 116 bytes tests/acpi-test-data/q35/FACP | Bin 116 -> 244 bytes 2 files changed, 0 insertions(+), 0 deletions(-) (limited to 'tests') diff --git a/tests/acpi-test-data/pc/FACP b/tests/acpi-test-data/pc/FACP index 0639999..261ebdc 100644 Binary files a/tests/acpi-test-data/pc/FACP and b/tests/acpi-test-data/pc/FACP differ diff --git a/tests/acpi-test-data/q35/FACP b/tests/acpi-test-data/q35/FACP index 19f3ac3..72c9d97 100644 Binary files a/tests/acpi-test-data/q35/FACP and b/tests/acpi-test-data/q35/FACP differ -- cgit v1.1